9 标准I/O流

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FAKER_0X0/article/details/89678236

9 C++输入和输出流

9.1 I/O流的概念和流类库的结构

C++输入输出包含以下三个方面的内容:
标准设备 标准I/O
外存磁盘文件 文件I/O
内存 串I/O

C++的I/O对C的发展–类型安全和可扩展性
在C++的输入输出中,编译系统对数据类型进行严格的检查,凡是类型不正确的数据都不可能通过编译。因此C++的I/O操作是类型安全(type safe)的。C++的I/O操作是可扩展的,不仅可以用来输入输出标准类型的数据,也可以用于用户自定义类型的数据。
C++通过I/O类库来实现丰富的I/O功能。iostream类库

iostream类是从istream类和ostream类通过多重继承而派生的类。其继承层次见上图表示。
与iostream类库有关的头文件
• iostream 包含了对输入输出流进行操作所需的基本信息。
• fstream 用于用户管理的文件的I/O操作。
• strstream 用于字符串流I/O。
• stdiostream 用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序。
• iomanip 在使用格式化I/O时应包含此头文件。
在iostream头文件中定义的流对象
cin cout cerr clog
在iostream头文件中重载运算符
“<<”和“>>”

9.2标准I/O流

cout流对象
ostream流类的对象,在iostream中定义。
输出基本类型的数据时,可以不必考虑数据是什么类型,系统会判断数据的类型,并根据其类型选择调用与之匹配的运算符重载函数。
cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout流插入一个endl时,不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符, 并刷新流(清空缓冲区)。注意如果插人一个换行符”\n“(如cout<<a<<"\n"),则只输出和换行,而不刷新cout 流(但并不是所有编译系统都体现出这一区别)。
cerr流对象
标准错误流,作用是向标准错误设备输出有关出错信息。cerr与标准输出流cout的作用和用法差不多。但有一点不同:cout流通常是传送到显示器输出,但也可以被重定向 输出到磁盘文件,而cerr流中的信息只能在显示器输出。
clog流对象
作用和cerr相同,都是在终端显示器上显示出错信息。区别:cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出。

9.2.1标准输入流

标准输入流对象cin,重点掌握的函数(注意缓冲区的概念)7个
cin.get() 一次只能读取一个字符 ch = cin.get()
cin.get(一个参数) 读一个字符 cin.get(a);
cin.get(三个参数) 可以读字符串 cin.get(a).get(b).get©;
cin.getline() 可以接收输入带有空格的字符串 cin.getline(buf2, 256);而cin>>buf[256]这种无法接收空格
cin.ignore() cin.ignore(2) 忽略即将要接收的两个字符
cin.peek() 没有缓冲区,默认是阻塞模式;缓冲区若有数据,返回第一个数据的asc码 ret = cin.peek();
cin.putback() 把字符放回缓冲区 cin.putback©;

9.2.2标准输出流

标准输出流对象cout
cout.flush() 刷新缓冲区
cout.put() cout.put(‘h’).put(‘e’).put(‘l’).put(’\n’); 一个一个字符输出
cout.write() cout.write(“hello world”, 4); //输出的长度
cout.width() 设置输出宽度 cout.width(30);
cout.fill() 填充效果 cout.fill(’*’);
cout.setf(标记)
C++格式化输出,C++输出格式控制
1)使用控制符的方法;
2)使用流对象的有关成员函数。

了解,用到的时候查找帮助即可。
使用控制符的方法

如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios::right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。

用流对象的成员函数控制输出格式

格式标志在类ios中被定义为枚举值。因此在引用这些格式标志时要在前面加上类名ios和域运算符“::”。
几点说明:

  1. 成员函数width(n)和控制符setw(n)只对其后的第一个输出项有效。
  2. 在用成员函数setf和 控制符setiosflags设置输出格式状态后,如果想改设置为同组的另一状态,应当调用成员函数unsetf(对应于成员函数self)或 resetiosflags(对应于控制符setiosflags),先终止原来设置的状态。
  3. 用setf 函数设置格式状态时,可以包含两个或多个格式标志,由于这些格式标志在ios类中被定义为枚举值,每一个格式标志以一个二进位代表,因此可以用位或运算符“|”组合多个格式标志。

9.3文件I/O

9.3.1文件流类和文件流对象

头文件 #include “fstream” ,定义了三个类ifstream、ofstream、fstream,必须自己定义一个该类的对象。

9.3.2C++文件的打开与关闭

打开文件
打开文件是指在文件读写之前做必要的准备工作,包括:
1)为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。
2)指定文件的工作方式,如,该文件是作为输入文件还是输出文件,是ASCII文件还是二进制文件等。

以上工作可以通过两种不同的方法实现:

  1. 调用文件流的成员函数open。如
    ofstream outfile; //定义ofstream类(输出文件流类)对象outfile
    outfile.open(“f1.dat”,ios::out); //使文件流与f1.dat文件建立关联
    磁盘文件名可以包括路径,如"c:\new\f1.dat",如缺省路径,则默认为当前目录下的文件。
  2. 在定义文件流对象时指定参数
    在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能。因此,可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。如
    ofstream outfile(“f1.dat”,ios::out); 一般多用此形式,比较方便。

几点说明:
1) 新版本的I/O类库中不提供ios::nocreate和ios::noreplace。
2) 每一个打开的文件都有一个文件指针,该指针的初始位置由I/O方式指定,每次读写都从文件指针的当前位置开始。当文件指针移到最后,就会遇到文件结束EOF(文件结束符也占一个字节,其值为-1),此时流对象的成员函数eof的值为非0值(一般设为1)
3) 可以用“位或”运算符“|”对输入输出方式进行组合
4) 如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。
关闭文件
在对已打开的磁盘文件的读写操作完成后,应关闭该文件。 outfile.close( );
所谓关闭,实际上是解除该磁盘文件与文件流的关联,原来设置的工作方式也失效,这样,就不能再通过文件流对该文件进行输入或输出。

9.3.3C++对ASCII文件的读写操作

如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件)。
(1) 在对磁盘文件的操作中,可以通过文件流对象和“<<”及“>>”实现对磁盘文件的读写。
(2) 用文件流的put、get、geiline等成员函数进行字符的输入输出。

9.3.4 C++对二进制文件的读写操作

二进制文件将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。
在打开时要用ios::binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。
用成员函数read和write读写二进制文件
istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);

fout.write((char *)&t1, sizeof Teacher);
fin.read((char *)&tmp, sizeof Teacher);

猜你喜欢

转载自blog.csdn.net/FAKER_0X0/article/details/89678236
9 I