IO流
在C++语言中没有定义专门的输入输入(I/O)语句。输入输出操作是通过IO流实现的。在C++编译系统中带有一个面向对象的IO软件包,这就是IO流类库。
流概念
“流(stream)”实际上是一个字节序列(字节流),是指数据从一个位置流向另一个位置的抽象。在C++程序中,数据可以从键盘或外部文件流入到程序的数据结构中(输入),也可以从程序中流向屏幕或外部文件(输出)。通常把从流中获取数据的操作(读操作)称为提取操作,而向流中添加数据的操作(写操作)称为插入操作。流是有方向的,故会出现输入流和输出流的对立面。IO流:数据在外部设备和内存之间的流动。
文件概念
文件:存储在外部设备上的数据的集合。它可以使数据得以长期保存。
C++把每个文件都看成是一个有序的字节序列,每个文件都以文件结束标志结束。
C++程序中处理的数据文件按数据组织形式可分为:
- ASCII文件(文本文件) :文件中的信息形式为ASCII码字符,每个字符占一个字节。数字3.14159存储是占7个字节。
- 二进制文件(内部格式文件):把内部中的数据按其在内存中的存储形原样输出到磁盘上。数值数据按二进制方式存储,字符仍按ASCII方式存储。数字3.14159存储是占4个字节。
C++ I/O流概述
IO流的类层次图
<ios>虚基类 定义了IO流类的虚基类ios,通常不直接用它。以下关于输入输出的类都是ios的派生类。 <fstreambase>文件流基类 <strstreambase>字符串流基类 |
<istream>输入流类库 <ostream>输出流类库 <iostream>标准IO流类 |
ifstream 输入文件流类 ofstream 输出文件流类 fstream 输入输出文件流类 这三个类都定义在头文件<fstream>中 |
<istrstream>输入字符串流 <ostrstream>输出字符串流 <strstream>输入输出字符串流 |
备注:
经常用到的是:<iostream><fstream><strstream>输入输出流/文件流/字符串流库
- 标准流类:处理与标准输入设备(键盘)和输出设备(显示器)关联的数据流
- 文件流类:处理与键盘文件关联的数据流
- 字符串流类:利用内存中的字符串数组处理数据的输入输出
- 异常类等:处理异常错误
C++C++流类中已预定义了四个对象:
cin:是istream类的对象 | 标准输出,通常是键盘,用于处理标准输入设备(键盘)的输入; |
cout:是ostream类的对象 | 标准输入,通常是显示器,用于处理标准输出设备(显示器)的输出; 有缓冲 |
cerr:是ostream类的对象 | 标准错误,通常是显示器,用于处理在标准设备(显示器)上输出出错信息(不带缓冲,即立即显示); |
clog:是ostream类的对象 | 标准日志,通常是显示器,用于处理在标准输出设备(显示器)上输出错误信息(有缓冲),当缓冲区满时输出。 |
备注:输出缓冲遇到换行,有输入,flush,满,程序结束时自动刷新。
流插入(<<)和提取(>>)运算符:<<输出(应用于cout,cerr,clog);>>输入(应用于cin)。
输出流
输出流:与输出设备(如屏幕)相关联的流。即由内存流向外部设备的数据流。
C++输出流类主要是ostream和ofstream,ostrstream。
ostream类最适合顺序文本的输出,通常使用cout,cerr或clog这些预定义的对象实现输出操作。
ofstream类还支持磁盘文件的输出。C++中,磁盘文件被看做一个字符序列。要处理磁盘文件,就需要定义文件输出流对象。
定义文件输出流对象
方法1:先定义文件对象,然后调用open成员函数打开该文件。
ofstream outfile;//创建文件输出流对象
outfile.open(“datal.tex”,ios::out);//打开文件,使流对象与文件”datal.txt”关联
方法2:在定义文件输出流对象时初始化打开文件
ofstream outfile.open(“datal.tex”,ios::out);
输出流常用成员函数
put() | 输出流对象名.put(char ch) 该函数仅输出一个字符,且返回当前输出流对象。例如: cout.put(‘A’).put(‘t’); 输出结果为:At |
write() | 输出流对象名.write(char *s,int n) 该函数输出字符指针所指向的字符串中的n个字符。当s所指字符串不足n时补空格, 函数返回当前输出流对象。例如: cout.write("12345",3).write("ABCDE",7).put(‘t’); 输出结果为:123ABCDE t |
seekp() | 输出流对象名.seekp(流中位置) 输出流对象名.seekp(偏移量,参照位置) 其中,流中位置、偏移量均为long型,以字节为单位。 参照位置有三种: — beg(0)表示相对于流的开始位置 — cur(1)表示相对于当前写指针所指向的位置 — end(2)表示相对于流的结尾处 seekp函数是设置文件输出流写指针位置用的,指出下次写出数据的起始位置。利用该指针可实现向磁盘文件随机输出。它们均返回当前输出流对象。 |
tellp() | 输出流对象名.tellp() 该函数返回当前输出流写指针的位置值。 |
close() | 在C++中,对磁盘文件操作后均需关闭。该函数的用法是: 输出流对象名.close() 该函数既无参数,也无返回值。当程序正常结束时不用此函数也可以完成同样的作用。 |
eof() | 输出流对象.eof() 执行该函数时,若遇到文件结尾的条件,则返回非0值。 |
输入流
输入流:与输入设备(如键盘)相联系的流。即由外部设备流向内存的数据流。
C++的输入流类主要是istream和ifstream。前者最适合输入顺序文本,通常使用预先定义的流对象cin处理;后者支持磁盘文件的输入。这些文件或是一个文本文件,或是一个二进制文件。与处理磁盘输出文件类似,要处理磁盘输入文件也必须先定义文件输入流对象。
定义文件输出流对象
方法1:先定义文件对象,然后调用open函数打开文件,与指定文件建立关联。例如:
ifstream infile; //建立文件输入流对象
inflie.open("datal.txt",ios::in);
方法2:在定义文件输入流对象时初始化,打开相关联的文件。例如:
ifstream infile("data1.txt",ios::in);
输入流常用成员函数
Get() | 该函数有以下三种主要使用形式: 输入流对象名.get() 这种形式的get函数是从输入流中获取一个字符(包括空白符)作为函数值。所谓空白符指的是空格符、制表符、换行符以及转义字符’\r’、’\t’、’\f’、’\n’、’\v’。 输入流对象名.get(char &c) 这种形式的get函数也是从输入流中获取一个字符(包括空白符),并存放在变量c中。 输入流对象名.get(char *s,int n,int Delim=’\n’) 这种形式的get函数是从输入流中最多获取n个字符(包括空白符),并存放在数组s中,缺省结束符为换行符,且自动将换行符转换为字符串结束标志符插入到字符串尾。该函数返回当前输入流对象。 此函数的结束条件除了上面提到的已读入n个字符、遇到换行符或指定结束符外,当遇到流输入结束符ctrl+z(EOF)时也结束(UNIX中为Ctrl+d)。 |
Getline() | 输入流对象名. getline(char *buf,int n,char Delim=‘\n’) 该函数最多获取n个字符并存入字符指针buf所指向的存储区中,缺省结束符为换行符,且自动将换行符转换为字符串结束标志符插入到字符串尾。该函数返回当前输入流对象。 此函数的结束条件除了上面提到的已读入n-1个字符、遇到换行符或指定结束符外,当遇到流输入结束符ctrl+z(EOF)时也结束(UNIX中为Ctrl+d)。 可见getline()函数和类似的get()函数的功能基本相同。唯一的区别是getline会从输入流中删除输入流结束符,而get函数不删除结束符 |
Read() | 输入流对象名. read(char *buf,int n) 该函数从输入流中读取n个字节(含换行符在内)或遇到输入流结束符(ctrl+z)时结束操作。读入后存入buf指针所指存储区,且不在字符串尾添加空字符(‘\0’)。该函数返回当前输入流对象 |
Seekg() Tellg() | 它们是设置文件流读指针和返回当前文件流读指针位置的函数。它们的用法与seekp和tellp函数相同: 输入流对象名.seekg(流中位置) 输入流对象名.seekg(偏移量,参照位置) 输入流对象名.tellg() |