标准I/O
文件I/O
串I/O
C++
的I/O
操作是类型安全(type safe)的
C++
的I/O
操作是可扩展的
C++
的输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。
在内存中为每一个数据流开辟一个内存缓冲区,用来存放流中的数据。流是与内存缓冲区相对应的,或者说,缓冲区中的数据就是流。
C++
的I/O
库中的类称为流类(stream class)。用流类定义的对象称为流对象。
cout
和cin
并不是C++
语言中提供的语句,它们是iostream类
的对象,头文件(include
)是程序与类库的接口,iostream
类库的接口分别由不同的头文件来实现。常用的有
iostream
包含了对输入输出流进行操作所需的基本信息。fstream
用于用户管理的文件的I/O
操作。strstream
用于字符串流I/O
。stdiostream
用于混合使用C
和C++
的I/O
机制时。iomanip
在使用格式化I/O
时应包含此头文件。在iostream
头文件中
ios,istream,ostream,iostream,istream _withassign, ostream_withassign,iostream_withassign
等。cin
是istream
的派生类istream_withassign
的对象,它是从标准输入设备(键盘)输入到内存的数据流,称为cin
流或标准输入流。cout
是ostream
的派生类ostream_withassign
的对象。
cout
流在内存中对应开辟了一个缓冲区,用来存放流中的数据,当向cout
流插入一个endl
时,不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符,并刷新流(清空缓冲区)。cerr
:向输出设备(显示器) 输出出错信息
cerr
流中的信息是用户根据需要指定的。clog
(console log):向输出设备(显示器) 输出出错信息
clog
中的信息存放在缓冲区中,缓冲区满后或遇endl
时向显示器输出。用流成员函数put
输出字符
ostream
类除了提供上面介绍过的用于格式控制的成员函数外,还提供了专用于输出单个字符的成员函数put
。如cout.put(′a′);
调用该函数的结果是在屏幕上显示一个字符a
。putchar
函数实现。这个是在C
语言中提供的。cin流
cin
是istream
类的对象,它从标准输入设备(键盘)获取数据,程序中的变量通过流提取符“>>”
从流中提取数据。“>>”
从流中提取数据时通常**跳过输入流中的空格、tab键、换行符等空白字符。 **用于字符输入的流成员函数
get
函数读入一个字符 :无参数的,有一个参数的,有3个参数的。
get
函数:cin.get()
#include <iostream> int main( ) {int c; cout<<″enter a sentence:″<<endl; while((c=cin.get())!=EOF) cout.put(c); return 0; } 运行情况如下: enter a sentence: I study C++ very hard.↙(输入一行字符) I study C++ very hard. (输出该行字符) ^Z↙(程序结束)
get
函数:cin.get(ch)
while(cin.get(c)) //读取一个字符赋给字符变量c,如果读取成功,cin.get(c)为真 {cout.put(c);}
get
函数:cin.get(字符指针/字符数组,字符个数n,终止字符)
cin.get(ch,10,′\n′); <===>cin.get(ch,10);//默认换行符为终止字符,终止字符也可以用其他字符,如'x' cin.get(ch,10); char ch[20];
getline
函数读入一行字符:cin.getline(字符数组(或字符指针),字符个数n,终止标志字符);
cin.get(...)
和cin.getline(...)
的区别(这段话来自北大李戈老师的ppt)
istream
类的其他成员函数
eof 函数
(end of file)的缩写,表示“文件结束”。while(!cin.eof()){}
eof
函数值为非零值(表示真),否则为0(假)。peek函数
:观测下一个字符。c=cin.peek( );
putback函数
:cin.putback(ch);
get
或getline
函数从输入流中读取的字符ch返回到输入流,插入到当前指针位置,以供后面读取。ignore函数
:cin,ignore(n, 终止字符)
ignore(5, ′A′);
//跳过输入流中5个字符,遇′A′后就不再跳了ignore( )
(n默认值为1,终止字符默认为EOF)。相当于ignore(1,EOF)
cin.get()
,则缓冲区的指针是停留在终止字符那里的。这样会导致如果第二次cin.get()
的终止符和上一次的一样,那么就不能继续前进。想要避免这种情况可以用ignore
。int main( ) { char ch[20]; cin.get(ch,20,′/′); cout<<ch<<endl; cin.ignore( );//跳过输入流中一个字符 cin.get(ch,20,′/′); cout<<ch<<endl; return 0; } /* I like C++./I study C++./I am happy.↙ I like C++. I study C++.//没有ignore的话,这里的cin.get()就无法输入有效字符。 */
peak and putback实例(下图)
文件操作与文件流
外存文件
对用户来说,常用到的文件有两大类
对于字符信息,在内存中是以ASCII代码形式存放的,因此,无论用ASCII文件输出还是用二进制文件输出,其数据形式是一样的。但是对于数值数据,二者是不同的。例如有一个长整数100000,在内存中占4个字节,如果按内部格式直接输出,在磁盘文件中占4个字节,如果将它转换为ASCII码形式输出,则要占6个字节。
高级的I/O
低级的I/O
文件流(本身不是文件,而只是以文件为输入输出对象的流)
对磁盘文件的操作是通过文件流对象(而不是cin
和cout
)实现的。文件流对象是用文件流类定义的,而不是用istream
和ostream
类来定义的。
ifstream
类,它是从istream
类派生的。 用来支持从磁盘文件的输入。ofstream
类,它是从ostream
类派生的。 用来支持向磁盘文件的输出。fstream
类,它是从iostream
类派生的。 用来支持对磁盘文件的输入输出。建立一个输出文件流对象: ofstream outfile;
打开磁盘文件
open
。如文件流对象.open(磁盘文件名,输入输出方式);
ostream outfile(″f1.dat″,ios::out);
“|”
对输入输出方式进行组合。open
函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。关闭磁盘文件:outfile.close( );
//将输出文件流所关联的磁盘文件关闭
ASCII文件:文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符。
put,get,geiline
等成员函数进行字符的输入输出二进制文件
istream
类的成员函数read
和write
读写二进制文件
istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);
outfile. write(p1,50);
infile.read(p2,30);
在磁盘文件中有一个文件指针,用来指明当前应进行读写的位置。对于二进制文件,允许对指针进行控制,使它按用户的意图移动到所需的位置,以便在该位置上进行读写。文件流提供一些有关文件指针的成员函数。如指针的定位:infile.seekg(-50,ios::cur);
//输入文件中的指针从当前位置后移50字节
随机访问二进制数据文件
字符串流(内存流)。字符串流类有``istrstream,ostrstream 和 strstream`
字符流与文件流的区别
字符串流类没有open成员函数,因此要在建立字符串流对象时通过给定参数来确立字符串流与字符数组的关联。即通过调用构造函数来解决此问题。
ostrstream strout(ch1,20);
。建立输出字符串流对象strout
,并使strout
与字符数组ch1
关联(通过字符串流将数据输出到字符数组ch1),流缓冲区大小为20。
ostrstream::ostrstream(char *buffer,int n,int mode=ios::out);
。buffer是指向字符数组首元素的指针,n为指定的流缓冲区的大小(一般选与字符数组的大小相同,也可以不同),第3个参数是可选的,默认为ios::out方式。istrstream strin(ch2,20);
istrstream::istrstream(char *buffer);或者 istrstream::istrstream(char *buffer,int n)
。buffer是指向字符数组首元素的指针,用它来初始化流对象,n是缓冲区大小。strstream strio(ch3,sizeof(ch3),ios::in|ios::out);
strstream::strstream(char *buffer,int n,int mode);