C++强化 | 12 格式化输入输出与文件操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++强化 | 12 格式化输入输出与文件操作相关的知识,希望对你有一定的参考价值。



戳一戳!和我一起走进信息学的世界

导读

我们最开始就讲解了有关于输入输出的问题,那有没有别的输入输出方式呢?能不能通过输入输出控制其格式呢?如果我们想把数据从文件中输入,然后将结果输出到文件呢?


本篇文章中,让我们针对上面的内容,一起来学习一下格式化输入输出和文件操作吧!

往期回顾

【NOIP竞赛/CSP认证】

▶  赛前必看!信息学名师带你复习NOIP竞赛初赛及CSP认证初赛


【信息学精华帖】

▶  信息学的万般好处!附C++必备基础知识总结

▶  信息学提高班知识体系详解与家长常见问题解答!让孩子赢在提高班学习的起跑线!


【C++提高班教程】

▶  C++强化 | 01 新学期再出发!温故知新!

▶  C++强化 | 02 继续前行,三大结构终极介绍

▶  C++强化 | 03 一维数组入门

▶  C++强化 | 04 数组越界

▶  C++强化 | 05 一维数组经典应用

▶  C++强化 | 06 一篇文章带你掌握字符数组

▶  C++强化 | 07 二维数组

▶  C++强化 | 08 二维数组经典案例

▶  C++强化 | 09 一篇文章带你探索函数的奥秘

▶  C++强化 | 10 函数进阶必备

▶  C++强化 | 11 这样学递归,才不会觉得难


【C++基础班教程】

▶  C++总结 | 01 程序的世界

▶  C++总结 | 02 输出、换行与注释

▶  ​C++总结 | 03 变量定义、赋值与运算​

▶  ​C++总结 | 04 算术运算符与赋值运算符​

▶  ​C++总结 | 05 cin语句​

▶  ​C++总结 | 06 程序中的数据类型​

▶  ​C++总结 | 07 数据类型补充​

▶  ​C++总结 | 08 顺序结构​

▶  ​C++总结 | 09 if 和 if-else​

▶  C++总结 | 10 if嵌套与逻辑运算符

▶  C++总结 | 11 开关语句switch-case

▶  C++总结 | 12 for循环及其应用

▶  C++总结 | 13 数据范围与数据类型

▶  C++总结 | 14 break与continue

▶  C++总结 | 15 while与do-while

▶  C++总结 | 16 循环嵌套及其应用




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++语言方便。但是,因为需要指定格式,我们就可以更加方便的设置输入输出格式,有更多的自主选择权,能够实现更加丰富的功能

而实现上述功能,我们需要格式控制字符。常用的格式控制字符如下:


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;


执行结果如下:


C++强化


我们可以在格式控制字符前后加换行符也可以加其他的字符。例如:


#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;


格式控制字符的位置对应到后面的变量的位置上,图示如下:


C++强化


我们发现,格式控制字符就相当于帮助后面的变量“占坑”,变量会根据格式控制字符的格式,在输出的时候,输出到格式控制字符所在的位置。


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;


输出如下:


C++强化


如果我们想把同一行的按照行输出,若想读一行,需要使用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++强化

长按二维码关注

以上是关于C++强化 | 12 格式化输入输出与文件操作的主要内容,如果未能解决你的问题,请参考以下文章

C++中输入输出流及文件流操作笔记

C++——流类库与输入/输出

C++学习笔记55:流类库与输入输出

sublime编译器C++配置 -重定向输入输出

C++ Primer 5th笔记(chap 17 标准库特殊设施)未格式化的输入/输出操作

C++ 文件操作