C++强化 | 12 格式化输入输出与文件操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++强化 | 12 格式化输入输出与文件操作相关的知识,希望对你有一定的参考价值。
戳一戳!和我一起走进信息学的世界
导读
我们最开始就讲解了有关于输入输出的问题,那有没有别的输入输出方式呢?能不能通过输入输出控制其格式呢?如果我们想把数据从文件中输入,然后将结果输出到文件呢?
本篇文章中,让我们针对上面的内容,一起来学习一下格式化输入输出和文件操作吧!
往期回顾
【NOIP竞赛/CSP认证】
▶ 赛前必看!信息学名师带你复习NOIP竞赛初赛及CSP认证初赛
【信息学精华帖】
▶ 信息学提高班知识体系详解与家长常见问题解答!让孩子赢在提高班学习的起跑线!
【C++提高班教程】
▶ C++强化 | 02 继续前行,三大结构终极介绍
▶ C++强化 | 09 一篇文章带你探索函数的奥秘
【C++基础班教程】
▶ C++总结 | 11 开关语句switch-case
▶ C++总结 | 14 break与continue
▶ C++总结 | 15 while与do-while
1 说在前面的话
本篇文章,让我们一起深入了解更多有关于输入输出的内容,掌握文件的输入输出。
2 格式化输入输出
还记得我们最开始学C++的时候,学的是什么吗?
是输出,后来我们又学习了输入。
输入输出一直伴随我们从最开始到现在,是我们非常重要的朋友了。今天,我们再学习新的输入输出,让这个朋友的团队更强大吧!
在最前面我们要强调一下,我们需要用到一个新的头文件:
#include<cstdio>
不用下面这条语句:
using namespace std;
也就是说,我们的框架如下:
#include<cstdio>
int main()
return 0;
1 C++和C语言
在讲解后面的内容之前,我们先说一下C语言和C++。
要真正去讲解C和C++的区别,那可以讲很久啦!这里我们只做简单的介绍,让大家有一个最基本的了解,这些介绍和大家目前阶段的学习和信息学竞赛有很重要的关系。
C++,就是在C语言的基础上添加了更加高级的功能,相比于C语言,C++更加的强大,C++支持所有的C语言功能!
这些高级功能里面,最重要的就是类的相关概念和知识。因为C++支持类,支持使用类去创建对象。所以,C++是面向对象的编程语言,C语言是面向过程的编程语言。
除此之外,C和C++的输入输出也不一样,我们今天讲的格式化输入输出,是C语言的常用输入输出方式。前面我们说,C++支持C语言所有功能,所以格式化输入输出,C++也是支持的。
总结一下我们上面说的:
C++是在C语言的基础上增加了更多新功能,支持C语言的所有功能。
C++是面向对象的编程语言,C语言是面向过程的编程语言。
C++的输入输出和C语言的不同,但是C++支持C语言的输入输出。
除此之外,C++还在很多方面有所扩展和提升。具体的,大家可以去网上详细了解。
2 格式控制字符
所谓的格式化输入输出,就是输入输出要按照固定的格式读入,按照固定的格式输出!
C++输入输出的时候,会自动适配数据的类型,不用我们指定。C语言无法自动适配,必须要指定输入输出的类型,比如,输出为整数类型,以字符型数据输入。
对于C语言的输入输出来说,在使用时,不如C++语言方便。但是,因为需要指定格式,我们就可以更加方便的设置输入输出格式,有更多的自主选择权,能够实现更加丰富的功能。
而实现上述功能,我们需要格式控制字符。常用的格式控制字符如下:
主要我们需要掌握如下几个:
基本类型:
%d:转换为对应的十进制整数数据;
%ld:转换为对应的十进制长整型数据;
%c:转换为对应的字符数据;
%f:转换为对应的浮点型数据,注意,小数部分默认输出6位;
%s:转换为对应的字符串类型;
固定数位类型:
%md:转换为对应的十进制整数数据,如果不够m位,前面自动补空格;
%.mf:转换为对应的浮点型数据,小数部分保留m位;
进制类型:
%x/%X/%#x/%#X:将数据转化为对应的16进制。
注意:
对于固定数位来说,具体使用过程中,要将m换为具体的数值。
对于进制类型来说,如果我们使用的是%x/%X,那我们输出的就是对应的16进制的数值,如果是使用%#x/%#X,那我们对应输出的是0x[十六进制数值]。例如:
65
如果使用%x/%X,则转换为41;
如果使用%#x/%#X,则转换为0x41。
3 格式化输出
首先我们先考虑最简单的输出,格式化输出使用printf。
例如:输出:Hello AI与区块链技术。
代码如下:
#include<cstdio>
int main()
printf("Hello AI与区块链技术");
return 0;
如果我们要使用printf输出变量或者表达式,我们就要使用如下格式:
printf("格式控制字符", 变量/表达式);
例如:
#include<cstdio>
int main()
int a = 65;
float b = 65.666777;
printf("%d", a); //输出对应的10进制数字
printf("%f", b); //输出为对应的浮点型数据
printf("%c", a); //输出为对应的字符数据
printf("%5d", a); //输出前面使用空格补够5位
printf("%.5f", b); //输出小数后面保留5位
printf("%x", a); //输出为对应的16进制数据
printf("%#x", a); //输出为对应的16进制数据,前面加0x
return 0;
在格式化输出的时候,格式控制字符的作用是:将要输出的字符转换成格式控制字符指定格式。
我们发现,所有的都写在一行上面了,如果想换行,就要使用转义字符\\n来换行,将\\n写在格式控制字符的前面或者后面:
#include<cstdio>
int main()
int a = 65;
float b = 65.666777;
printf("%d", a); //输出对应的10进制数字
printf("\\n%f\\n", b); //输出为对应的浮点型数据
printf("%c\\n", a); //输出为对应的字符数据
printf("%5d\\n", a); //输出前面使用空格补够5位
printf("%.5f\\n", b); //输出小数后面保留5位
printf("%x\\n", a); //输出为对应的16进制数据
printf("%#x\\n", a); //输出为对应的16进制数据,前面加0x
return 0;
执行结果如下:
我们可以在格式控制字符前后加换行符也可以加其他的字符。例如:
#include<cstdio>
int main()
int a = 65;
printf("你输入的整数是:%d\\n", a);
printf("对应的字符为:%c\\n", a);
printf("对应的十六进制为:%#x\\n", a);
return 0;
如果我们想一次性写完,不分成多个语句,那变量就要都通过逗号分隔开,添加到一个printf语句中:
#include<cstdio>
int main()
int a = 65;
float b = 65.666777;
printf("整数:%d\\n小数:%f\\n", a, b);
return 0;
格式控制字符的位置对应到后面的变量的位置上,图示如下:
我们发现,格式控制字符就相当于帮助后面的变量“占坑”,变量会根据格式控制字符的格式,在输出的时候,输出到格式控制字符所在的位置。
4 格式化输入
格式化输入要稍微难一丢丢!不过没关系!
格式化输入使用的是scanf,我们先看一个简单的示例,定义一个整型变量并输入:
#include<cstdio>
int main()
int a;
printf("请输入一个整数:");
scanf("%d", &a);
printf("a = %d\\n", a);
return 0;
scanf的格式如下:
scanf("格式控制字符", &变量);
在格式化输入的时候,格式控制字符的作用是:将要输入的字符转换成格式控制字符指定格式。
同时变量名前面要添加一个&符号,这个符号在这里的含义是取地址符,即获取某个变量所在空间的地址,根据地址就能找到对应的变量啦!就像你知道了朋友的家,就能去朋友家找朋友去玩啦!
在此总结一下&我们目前掌握的用法,主要有:
两个&用作逻辑与;
函数参数的引用调用;
格式化输入中变量的取地址符,用于获取变量的地址。
如果我们同时输入多个变量:
#include<cstdio>
int main()
int a,b,c;
printf("请输入三个整数:");
scanf("%d%d%d", &a, &b, &c);
printf("a = %d\\nb = %d\\nc = %d\\n", a, b, c);
return 0;
5 为什么要用格式化输入输出?
格式化输入输出比cin,cout要麻烦,那为什么还要使用格式化输入输出呢?
一方面,格式化输入输出可以指定想要的格式,比如我们想要让整数数据右对齐,那就可以设为%md格式;比如我们想要设置固定的小数点保留位数,就可以设为%.mf格式。
另一方面,cin和cout适配性强造成的一个后果是,解析数据慢,而printf和scanf解析数据更快,对于大规模数据输入输出,用printf和scanf性能更高。特别是在信息学竞赛中,有时候使用cin和cout会导致超时,但是同样的程序,改为printf和scanf就不会超时。
3 文件操作
我们以前讲了很多内容,但是我们获取输入,数据输出,都是自己手动输入,输出到黑窗体!
现在我们希望能够从文件中读取数据,将数据输出保存到文件中。该怎么操作呢?
1 头文件与基本写法
我们需要用到一个新的头文件:
#include<fstream>
前面我们讲输入输出使用iostream,io表示输入输出,stream表示流。,所以iostream表示输入输出流。
fstream中,f表示file,即文件,stream表示流,用于读取或保存文件。
我们常常使用如下几个代码:
freopen(“读取的文件”, “r”, stdin);
freopen(“写入的文件”, “w”, stdout);
…
fclose(stdin);
fclose(stdout);
其中freopen用于打开文件,fclose用于关闭文件。
2 读文件详解
所谓读文件,就是从文件中读取数据。
我们需要先获取读取的文件,并进行读取,然后读取到数据,做完相关操作之后,将读取流关闭,防止占用文件。
我们使用的代码如下:
freopen("文件名", "r", stdin);
我们先在cpp文件同一文件夹下新建一个“1.txt”的文件,文件中写:
1 2 3
4 5 6
7 8 9
我们读取代码如下:
#include<iostream> //输入输出
#include<fstream> //读写文件
using namespace std;
int main()
string s;
freopen("1.txt", "r", stdin);
while(cin>>s)
cout<<s<<endl;
fclose(stdin);
return 0;
输出如下:
如果我们想把同一行的按照行输出,若想读一行,需要使用getline函数。
#include<iostream> //输入输出
#include<fstream> //读写文件
using namespace std;
int main()
string s;
freopen("1.txt", "r", stdin);
while(getline(cin, s))
cout<<s<<endl;
fclose(stdin);
return 0;
3 写文件详解
所谓写文件,就是将数据写入到文件中。
我们需要先获取要写入的文件,写入数据,做完相关操作之后,将读取流关闭,防止占用文件。
我们使用的代码如下:
#include<iostream> //输入输出
#include<fstream> //读写文件
using namespace std;
int main()
string s;
freopen("1.txt", "w", stdout);
cout<<"AI and BlockChain technology!";
fclose(stdout);
return 0;
我们会发现,这种写法,会将文件中原来的东西替换掉,如果我们想保留之前的,将新数据追加到后面,可以这么写:
#include<iostream> //输入输出
#include<fstream> //读写文件
using namespace std;
int main()
string s;
freopen("1.txt", "a", stdout);
cout<<"\\nAI and BlockChain technology!\\n";
fclose(stdout);
return 0;
也就是说,我们主要有两种写入模式:
w:覆盖写入,会完全覆盖源文件内容,将新内容写入;
a:附加写入,会在源文件的后面附加新内容。
4 习题
习题针对格式化输入输出和文件操作:
1 完成下面内容
使用格式化输入输出和文件操作完成下面内容:
1、定义一个int类型数据,float类型数据和char类型数据;
2、分别使用格式化输入给上面三个类型数据赋值;第一个数据赋值为97;
3、格式化输出上面的数据(基本类型);
4、将第一个数据按照字符类型输出;
5、将float类型数据保留到小数点后5位输出;
6、将上面三个数据保存到‘1.txt’文件中,每个数据占一行。
7、将上面三个数据附加到‘1.txt’文件中,用空格隔开。
8、关闭文件;
9、打开文件‘1.txt’,并读取文件内容。
2 文件操作
有‘2.txt’文件,文件中有五个整数,用空格隔开,例如:
1 2 3 4 5
从文件中读取5个整数,并将这五个数据的和附加到文件中,例如:
1 2 3 4 5
1+2+3+4+5=15
编写程序实现上述功能。
AI与区块链技术
长按二维码关注
以上是关于C++强化 | 12 格式化输入输出与文件操作的主要内容,如果未能解决你的问题,请参考以下文章