【C++】<知识点> 标准和文件的输入输出

news2024/11/17 20:30:22

目录

        一、输入输出操作

                1. 相关的类

                2. 标准流对象

                3. istream类的成员函数

二、流操纵算子

        1. 整数流的基数

        2. 浮点数精度的流操纵算子

        3. 域宽的流操纵算子

        4. 其他的流操纵算子

        5. 用户自定义流操纵算子

三、文件读写

        1. 文本文件的读写

        2. 二进制文件的读写

        3. 文件读写指针

        4. 文本文件和二进制文件区别


一、输入输出操作

1. 相关的类

  • ios基类派生出istream和ostream。
  • istream派生出ifstream,ostream派生出ofstream。
  • iostream继承自istream和ostream。
  • fstream继承自iostream。

注意:cin就是istream类的对象,cout就是istream类的对象。

2. 标准流对象

(1) 输入流对象:cin与标准输入设备相连(从键盘获取数据)。也可以被重定向为从文件中读取数据。

(2) 输出流对象:

  • cout与标准输出设备相连(在屏幕上打印数据)。也可以被重定向为向文件写入数据(freopen函数)。
  • cerr与标准错误输出设备相连。
  • clog与标准错误输出设备相连。
  • cerr和clog的区别在于cerr不使用缓冲区,直接向显示器输出信息;而clog采用缓冲区,只有缓冲区满或者刷新时才会输出到屏幕上。

(3) 代码示例:

【1】输出重定向

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

int main()
{
	double x, y;
	cin >> x >> y;
	//freopen函数:输出重定向到文件
	//原型:FILE *freopen(const char *path, const char *mode, FILE * stream);
	//path是目标文件
	//mode为文件打开模式"r"或"w"
	//stream为标准流文件,例如stdin标准输入流, stdout标准输出流, stderr标准错误流
	freopen("cout.txt", "w", stdout);
	if (y == 0) {
		cerr << "error!" << endl;
	}
	else {
		cout << x / y;//输出到文件cout.txt中
	}
	return 0;
}

  

显然,屏幕上并没有输出计算结果0.5,该结果输出到cout.txt文件中。

【2】输入重定向

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

int main()
{
	int n1 = 0, n2 = 0;
	//freopen函数:输入重定向
	freopen("input.txt", "r", stdin);
	cin >> n1 >> n2;//由于重定向了,不会在终端等用户输入
	cout << "结果:" << n1 << ", " << n2 << endl;
	return 0;
}

【3】判断输入流结束

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

int main()
{
	int x;
	freopen("test.txt", "r", stdin);
	while (cin >> x) {
		cout << "读入:" << x << endl;
	}
	return 0;
}

注意:①这里将cin重定向为从文件读取数据,那么读到文件末尾即结束。若未重定向,从键盘中输入则需要单独一行输入Ctrl+Z代表输入流结束。cin >> x返回值为istream&,而istream会有对象的重载,将其转换成bool类型,因此可以作为循环条件。

3. istream类的成员函数

(1) getline函数:

  • 原型:①istream& getline(char* buf, int bufSize); ②istream& getline(char* buf, int bufSize, char delim);
  • 对于第一个原型:从输入流中读取bufSize-1个字符到缓冲区buf,或读到'\n'为止(哪个先到算哪个)。
  • 对于第二个原型:从输入流中读取bufSize-1个字符到缓冲区buf,或读到delim字符为止(哪个先到算哪个)。
  •  注意:
    • 两个函数都会自动在buf中读入数据的结尾添加'\0'。
    • ‘\0’和delim都不会被读入buf,但会被输入流中取走。
    • 如果输入流中'\n'或delim之前的字符个数达到或超过了bufSize个,就导致读入错误,即虽然本次读入已经完成,但是之后的读入就都失败了。
    • 可以用if (!cin.getline(...))判断输入是否结束。

(2) bool eof(); 用于判断输入流是否结束。

(3) int peek(); 返回下一个字符,但不从流中去除。

(4) istream& putback(char c); 将字符ch放回输入流的头部。

(5) istream& ignore(int nCount = 1, int delim = EOF); 从流中删掉最多nCount个字符,遇到EOF结束。

(6) getline函数代码示例:

#include <iostream>
using namespace std;

int main()
{
	int x;
	char buf[90];
	cin >> x;
	cin.getline(buf, 90, '\n');
	cout << buf << endl;
	return 0;
}


二、流操纵算子

1. 整数流的基数

(1) 说明:在cout时,可以指定输出的整数的进制:dec(十进制)、oct(八进制)、hex(十六进制)。

(2) 注意:①使用流操纵算子,需要添加头文件iomanip。②一旦设置,就会持续有效直到新的操纵算子出现。

(3) 代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
	int n = 10;
	cout << dec << n << endl;//十进制显示n
	cout << oct << n << endl;//八进制显示n
	cout << hex << n << endl;//十六进制显示n
	//一旦设置dec、oct或者hex,就会持续有效直到写新操纵算子。
	cout << n << endl;
	return 0;
}

2. 浮点数精度的流操纵算子

(1) precision:是ostream的成员函数,调用方式为:cout.precision(5); 用于指定浮点数的有效位数(非定点方式)系统默认是非定点方式。

(2) setprecision:流操纵算子,调用方式为:cout << setprecision(5); 用于指定浮点数的有效位数(非定点方式)和指定浮点数的小数后的有效位数(非定点方式)定点方式:小数点必须出现在个位数后面。

(3) 注意:

  • 当位数超过精度时会四舍五入。
  • setprecision方式会持续有效,直到设置新的精确度。
  • setprecision操纵算子也需要添加头文件iomanip。
  • 在非定点方式下,setprecision可能会使用科学计数法来表示。

(4) setiosflags(ios::fixed):以小数点位置固定的方式来输出(可以简单用cout << fixed;)。另外,cout << scientific表示采用科学计数法。

(5) resetiosflags(ios::fixed):取消以小数点位置固定的方式来输出。

(6) 代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
	float f = 1234567.89;
	int n = 123456;
	//默认是非定点方式
	cout << "*****非定点******" << endl;
	cout << setprecision(6);//设置浮点数有效位数为6
	cout << f << endl;//由于非定点方式且规定只能有6位,因此用科学计数法显示
	cout << n << endl;//浮点数的操纵算子不影响整数
	//修改为定点方式
	cout << "*****定点********" << endl;
	cout << setiosflags(ios::fixed);
	cout << f << endl;//小数点后有6位,不够就补0
	//修改为非定点方式
	cout << "*****非定点******" << endl;
	cout << resetiosflags(ios::fixed);
	cout << f << endl;//由于非定点方式且规定只能有6位,因此用科学计数法显示
	return 0;
}

3. 域宽的流操纵算子

(1) setw:流操纵算子,用于设置域宽。调用方式:cout << setw(5)或cin >> setw(5)。

(2) width:成员函数,用于设置域宽。调用方式:cout.width(5)或cin.width(5)。

(3) 注意:域宽的流操纵算子是一次性的,每次输入输出前都需要指定宽度。

(4) 代码示例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
	int m = 4;
	char string[10];
	cin >> setw(5);//设置输入宽度
	while (cin >> string) {
		cout << setw(m++);//设置输出宽度
		cout << string << endl;
		cin >> setw(5);
	}
	return 0;
}

(5) 结果解释:

  • 第一行是我们输入的数据1234567890.
  • 第二行输出1234。首先,设置输入宽度为5(实际上只接收4个字符,最后自动加'\0'),那么string里就是1234‘\0’。其次,设置输出宽度为4(设置完后m自增为5),那么输出4个字符即1234.
  • 第三行输出" 5678"。首先,设置输入宽度为5(实际上只接收4个字符,最后自动加'\0'),那么string里就是5678‘\0’。其次,设置输出宽度为5(设置完后m自增为6),那么输出5个字符即空格+5678.
  • 第四行输出"    90"。首先,设置输入宽度为5(实际上只接收4个字符,最后自动加'\0'),那么string里就是90‘\0’。其次,设置输出宽度为6(设置完后m自增为7),那么输出6个字符即4个空格+90.

4. 其他的流操纵算子

(1) cout << showpos; 非负数显示正号。

(2) cout << noshowpos; 非负数不显示正号。

(3) cout << setfill(*); 宽度不足用*填补。

(4) cout << right; 右对齐,宽度不足则左边填充。

(5) cout << left; 左对齐,宽度不足则右边填充。

(6) cout << internal; 在负号和数字之间填充。

(7) 综合案例:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
	int i = 141;
	double x = 1234567.89, y = 12.34567;
	//1) 8d 141 215
	cout << "1) " << hex << i << " " << dec << i << " " << oct << i << endl;

	//2) 1.2346e+006 12.346
	cout << "2) " << setprecision(5) << x << " " << y << endl;

	//3) 1234567.89000 12.34567
	cout << "3) " << fixed << setprecision(5) << x << " " << y << endl;

	//4) 1.23457e+006 1.23457e+001
	cout << "4) " << scientific << setprecision(5) << x << " " << y << endl;
		 
	//5) ***+12.10000
	cout << "5) " << showpos << right << fixed << setprecision(5) << setfill('*') << setw(12) << 12.1 << endl;

	//6) 12.10000****
	cout << "6) " << noshowpos << left << fixed << setprecision(5) << setfill('*') << setw(12) << 12.1 << endl;
	
	//7) ****12.10000
	cout << "7) " << noshowpos << right << fixed << setprecision(5) << setfill('*') << setw(12) << 12.1 << endl;
	
	//8) -***12.10000
	cout << "8) " << showpos << right << fixed << setprecision(5) << internal << setfill('*') << setw(12) << -12.1 << endl;
	
	//9) 12.10000
	cout << "9) " << noshowpos << fixed << setprecision(5) << 12.1 << endl;
	return 0;
}

5. 用户自定义流操纵算子

(1) 格式:

ostream& 函数名(ostream& cout) {
	//执行的操作
    return cout;
}

(2) 代码示例:定义tab流操纵算子。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

ostream& tab(ostream& output) {
	return output << '\t';
}

int main()
{
	cout << "a" << tab << "b" << endl;
	return 0;
}

(3) 底层解释:由于iostream里对<<进行了重载(使用成员函数方式),即ostream& operator << (ostream& (*p) (ostream&)); 其中ostream& (*p) (ostream&)是函数指针,能够根据函数名找到对应的函数并执行函数体,同时内部还返回了*this就是对象本身。因此,在上述示例中,tab就是一个函数名,会执行tab的函数体。


三、文件读写

1. 文本文件的读写

(1) 创建读文件对象:ifstream srcFile("in.txt", ios::in);

(2) 创建写文件对象:ofstream destFile("out.txt", ios::out);

(3) 从文件中读取字符:srcFile >> x;

(4) 将字符写入文件:destFile << x;

(5) 注意:

  • 写文件对象中ios::out选项:删除原有内容,写入新内容。
  • 写文件对象中ios::app选项:在原内容后面追加新内容。
  • 读写文件对象中ios::binary选项:以二进制方式写入/读取。
  • ifstream和ofstream换成fstream也行。

(6) 代码示例:将in.txt中的内容1 234 9 45 6 879排序,并存到out.txt中。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	//1.打开文件in.txt
	ifstream srcFile("./in.txt", ios::in);
	if (!srcFile) {
		cout << "srcFile文件打开失败!" << endl;
		return -1;
	}
	//2.读取文本字符并加入vector中
	int readInt;
	vector<int> v;
	while (srcFile >> readInt) {
		v.push_back(readInt);
	}
	//3.对vector中元素排序
	sort(v.begin(), v.end());
	//4.将排序结果写入out.txt
	ofstream outFile("./out.txt", ios::out);
	if (!outFile) {
		cout << "outFile文件打开失败!" << endl;
		return -1;
	}
	for (int i = 0; i < v.size(); i++) {
		outFile << v[i] << " ";
	}
	//5.关闭文件
	srcFile.close();
	outFile.close();
	return 0;
}

         

2. 二进制文件的读写

(1) 创建读写对象:方式与文本文件相同,但是选项要或(|)上ios::binary选项!

(2) 读文件:使用ifstream和fstream中的成员函数read函数。

  • 函数原型:istream& read(char* s, long n);
  • 功能:将文件读指针指向的地方的n个字节内容,读取到内存地址s,然后读指针向后移动n字节。

(3) 写文件:使用ofstream和fstream中的成员函数write函数。

  • 函数原型:istream& write(const char* s, long n);
  • 功能:将内存地址s处的n个字节内容,写入到写指针指向的位置,然后写指针向后移动n字节。

(4) 代码示例:将整数120写入二进制文件,再从该二进制文件中读取整数。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
	//写入ret于二进制文件out.dat中
	int ret = 120;
	ofstream outFile("./out.dat", ios::out | ios::binary);
	outFile.write((const char*)(&ret), sizeof(int));
	outFile.close();
	//从out.dat中读取一个整数
	int readInt;
	ifstream inFile("./out.dat", ios::in | ios::binary);
	inFile.read((char*)(&readInt), sizeof(int));
	inFile.close();
	//显示读取的整数
	cout << readInt << endl;
	return 0;
}

3. 文件读写指针

(1) 介绍:

  • 对于输入文件,有一个读指针。
  • 对于输出文件,有一个写指针。
  • 对于输入输出文件,有一个读写指针。
  • 读/写指针标识文件操作的当前位置。

(2) 读指针相关操作:

  • tellg():获取读指针的位置。调用方式:"输出对象.tellg()"。
  • seekg(int i):移动读指针至第i个字节处。调用方式:"输出对象.seekg(i)"。
  • seekg(int i, ios::beg):移动至距文件开始的第i个位置。
  • seekg(int i, ios::cur):移动至当前位置后的第i位置。
  • seekg(int i, ios::end):移动至距文件末尾的第i个位置。(常用于统计文本的字符数)

(3) 写指针相关操作:

  • tellp():获取写指针的位置。调用方式:"输出对象.tellp()"。
  • seekp(int i):移动写指针至第i个字节处。调用方式:"输出对象.seekp(i)"。
  • seekp(int i, ios::beg):移动至距文件开始的第i个位置。
  • seekp(int i, ios::cur):移动至当前位置后的第i位置。
  • seekp(int i, ios::end):移动至距文件末尾的第i个位置。

(4) 代码示例:输出A~Z于test.txt中,并且每两个字符间空两格。

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
	ofstream outFile("./test.txt", ios::out);
	/* 输出A~Z于test.txt中,并且每两个字符间空两格*/
	for (char i = 'A'; i <= 'Z'; i++) {
		//获取写文件指针位置
		int location = outFile.tellp();
		//写入字符
		outFile << i;
		//文件指针会自动+1,再使用seekp跳到后两个位置
		outFile.seekp(2, ios::cur);
		//打印测试信息
		cout << location << endl;
	}
	//关闭文件
	outFile.close();
	return 0;
}

4. 文本文件和二进制文件区别

(1) 不同操作系统下换行符号区别:

  • Linux下的换行:'\n'(ASCII:0x0a)
  • Windows下的换行:'\r\n'(ASCII:0x0d0a)
  • MacOS下的换行:'\r'(ASCII:0x0d)
  • 由于ASCII码不同,Linux和MacOS的文本文件在Windows中的记事本打开时不换行。

(2) 文本文件和二进制文件区别:

  • Linux下打开文件,用不用ios::binary没区别。
  • Windows下打开文件,如果不用ios::binary,则会造成①读取文件时,所有的'\r\n'都会被当作'\n'处理,因此会少读了一个字符'\r'。②写入文件时,写入单独的'\n'时,系统会自动加'\r',因此多写了一个字符'\r'。
  • 一般来说,使用二进制文件更加节省空间。例如,保存123456,若保存于文本文件则需要6个字节,而保存于二进制文件用一个int的字节就行了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1692759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

港湾周评|京东图书遭抵制不赢不输

《港湾商业观察》李镭 临近618前夕&#xff0c;数十家出版社抵制京东的消息引发全民关注。一定程上&#xff0c;本就生意冷门或不太赚钱的图书市场&#xff0c;随着这次群起抵制行动&#xff0c;更像是一场行业的反击。 不过&#xff0c;平台有平台的销售策略&#xff0c;毕竟…

给uniapp的扩展组件uni-file-picker设置默认显示的图片

官方给出的代码如下所示&#xff0c;但是按照官网给出的代码图片并没有显示出来。 <template><uni-file-picker readonly :value"fileLists" :imageStyles"imageStyles" file-mediatype"image"></uni-file-picker> </temp…

C#基础一

使用Visual Studio 2022&#xff08;VS2022&#xff09;编写C#控制台程序 1. 安装Visual Studio 2022 确保已安装Visual Studio 2022。如果未安装&#xff0c;请从Visual Studio官网下载并安装。 另一篇文章中已经有详细描述&#xff0c;这里就不在细说了。 VisualStudio2022…

文件自动同步备份-FreeFileSync工具解决硬盘损坏、误操作覆盖导致数据丢失

文件自动同步备份-FreeFileSync工具解决硬盘损坏、误操作覆盖导致数据丢失 文章目录 文件自动同步备份-FreeFileSync工具解决硬盘损坏、误操作覆盖导致数据丢失前言一、FreeFileSync二、使用方法1.用外部存储卡或盘作为异地备份目标盘2.设置同步策略3.设置为windows的自动计划 …

CentOS上升级glibc2.17至glibc2.31

glibc是Linux系统中的重要组件之一。在CentOS中&#xff0c;glibc通常是作为系统的默认C标准库使用的&#xff0c;因为它是许多软件的基础库。在CentOS中&#xff0c;glibc的版本通常与CentOS版本一起发布。因为CentOS通常会优先选择稳定性而不是最新性&#xff0c;所以CentOS使…

前端 CSS 经典:图片边框

前言&#xff1a;有这么一个业务&#xff0c;需要边框随着图片宽度的变化而变化&#xff0c;比如一些聊天的气泡框等。 实现原理&#xff1a;使用 border-image 属性 效果图&#xff1a; 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><he…

java抽象类,接口,枚举练习题

第一题&#xff1a; 答案&#xff1a; class Animal{//成员变量protected String name;protected int weight;//构造方法public Animal(){this.name"refer";this.weight50;}public Animal(String name,int weight){this.namename;this.weightweight;}//成员方法publ…

基于Android Studio记事本系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 具有登录&#xff0c;注册&#xff0c;记住密码&#xff0c;自动登录的功能&#xff1b; 可以新增记事本&#xff0c;编辑&#xff0c;删除记事本信息&#xff0c;同时可以设置主标题&#xff0c;内容&#xff0c;以及…

【网络】为什么udp协议报头有长度字段,而tcp没有

引言&#xff1a; 在网络通信中&#xff0c;UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议&#xff09;是两种常用的传输层协议。它们在设计和功能上有一些不同之处&#xff0c;其中之一就是报头中的长度字段。本文将深入探讨UDP和TCP协议中长度字…

LLM——探索大语言模型在心理学方面的应用研究

1. 概述 心理学经历了多次理论变革&#xff0c;目前人工智能&#xff08;AI&#xff09;和机器学习&#xff0c;特别是大型语言模型&#xff08;LLMs&#xff09;的使用&#xff0c;预示着新研究方向的开启。本文详细探讨了像ChatGPT这样的LLMs如何转变心理学研究。它讨论了LL…

LangChain笔记

很好的LLM知识博客&#xff1a; https://lilianweng.github.io/posts/2023-06-23-agent/ LangChain的prompt hub: https://smith.langchain.com/hub 一. Q&A 1. Q&A os.environ["OPENAI_API_KEY"] “OpenAI的KEY” # 把openai-key放到环境变量里&…

元宇宙虚拟线上会议,可应用于哪些行业和领域?

随着科技的飞速进步和互联网的广泛普及&#xff0c;线上元宇宙会议以其独特的魅力和优势&#xff0c;逐渐崭露头角&#xff0c;积木易搭旗下的元宇宙数字营销平台——视创云展&#xff0c;为线上元宇宙会议提供了全方位的服务&#xff0c;不仅涵盖了场景搭建、数字人互动、在线…

超简单白话文机器学习 - 回归树树剪枝(含算法介绍,公式,源代码实现以及调包实现)

1. 回归树 1.1 算法介绍 大家看到这篇文章时想必已经对树这个概念已经有基础了&#xff0c;如果不是很了解的朋友可以看看笔者的这篇文章&#xff1a; 超简单白话文机器学习-决策树算法全解&#xff08;含算法介绍&#xff0c;公式&#xff0c;源代码实现以及调包实现&#x…

小程序checkbox改成圆形与radio样式保持一致

修改前 修改后 html: <view class"agreement"><checkbox value"{{ isAgreed }}" bind:tap"toggleCheckbox" /><text>我同意室外智能健身房 <text class"link" bind:tap"showUserProtocol">用户协…

【C++】继承(二)深入理解继承:派生类默认成员函数与友元、静态成员的奥秘

目录 派生类的默认成员函数①派生类的构造函数②派生类的拷贝构造函数③派生类的赋值构造④派生类的析构函数 继承与友元继承与静态成员 前言 我们在上一章讲解了: 继承三部曲&#xff0c;本篇基于上次的基础继续深入了解继承的相关知识&#xff0c;欢迎大家和我一起学习继承 派…

Python小游戏——打砖块

文章目录 打砖块游戏项目介绍及实现项目介绍环境配置代码设计思路代码设计详细过程 难点分析源代码代码效果 打砖块游戏项目介绍及实现 项目介绍 打砖块游戏是一款经典的街机游戏&#xff0c;通过控制挡板来反弹小球打碎屏幕上的砖块。该项目使用Python语言和Pygame库进行实现…

牛客NC392 参加会议的最大数目【中等 贪心+小顶堆 Java/Go/PHP 力扣1353】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4d3151698e33454f98bce1284e553651 https://leetcode.cn/problems/maximum-number-of-events-that-can-be-attended/description/ 思路 贪心优先级队列Java代码 import java.util.*;public class Solution {/**…

纽曼新品X1000:轻巧便携仅重9.9公斤的1度电应急电源

在户外救援行动和应急设备中&#xff0c;电力供应的稳定性和安全性直接影响到救援工作的效率和成功率。在现代救援工作中&#xff0c;常见的光学声波探测仪、通信联络设备、气象检测仪、生命探测仪、照明设备等装备均需有持续的电力供应&#xff0c;才能保障救援工作的有序开展…

一文带你搞懂DiT(Diffusion Transformer)

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…

Redis 源码学习记录:集合 (set)

无序集合 Redis 源码版本&#xff1a;Redis-6.0.9&#xff0c;本篇文章无序集合的代码均在 intset.h / intset.c 文件中。 Redis 通常使用字典结构保存用户集合数据&#xff0c;字典键存储集合元素&#xff0c;字典值为空。如果一个集合全是整数&#xff0c;则使用字典国语浪费…