一、流状态查询和控制
int ival;
while(cin>>ival,!cin.eof())
{
if(cin.bad())
{
throw runtime_error("io stream corrupted");//runtime_error在stdexcept头文件中
}
if(cin.fail())
{
cerr<<"bad data,try again";
cin.clear(istream::goodbit);//如果去掉这一句,则有可能进入死循环,因为如果输入字符,则一直在cin中存在
cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n' );//必须加入头文件limits
continue;
}
}
多种状态的处理:is.setstate(ifstream::badbit | ifstream::failbit);
C++中清除输入缓冲区的方法是:
cin.clear(0); // 清除输入流的错误状态
cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); // 清除残留数据
二、输出缓冲区
a:endl可以显式的输出一个换行符并刷新缓冲区;flush可以刷新缓冲区,但不输出任何字符;ends在缓冲区插入null,然后刷新它,cin.tie(&cout),将输入流和输出流绑在一起,这样,每个读取输入流的尝试都会刷新输出的 缓冲区,这个可以在交互式系统中应用(.tie(0)是解除绑定)。
b:可以在每次输出操作执行完后,用unitbuf操纵符设置流的内部状态,从而清空缓冲区。
c:尽可能使用flush或者endl,因为程序崩溃了,则不会刷新缓冲区。
d:当输入流和输出流绑定在一起,任何输入流的操作都将首先刷新其输出流关联的缓冲区,标准库中cin和cout是关联在一起的。
三、文件的输入和输出
默认打开的是text和html类型的文件
string ifile="a";//最好加上路径,否则要放在exe同路径下
ifstream infile(ifile.c_str());//等价于ifstream infile("a"),是打开名为a的文件,不管文件是什么格式
if(!=infile)
{
cerr<<"error:unable to open input file: "<<ifile<<endl;
system("pause");
return -1;
}
四、文件模式
in:打开文件作读操作,ifsream或者fstream对象关联的文件
out:打开文件作写操作,ofsream或者fstream对象关联的文件,该模式会将文件清空,丢弃该文件存储的所有数据,但当以out和in同时打开时则不会清空文件
app:在每次写之前找到文件尾,所有文件,可以用该港式打开,不会丢弃文件数据
ate:打开文件后立即将文件定位在文件尾,ofsream或者fstream对象关联的文件
trunc:打开文件时晴空已存在的文件流,ofsream或者fstream对象关联的文件
binary:以二进制形式进行IO操作,所有文件
有效组合:
out | app:打开文件,在文件尾写入,不删除已有数据
out | trunc: 与out一样
in | out:打开做读写操作,定位于文件头
in | out | trunc :读写,删除已有数据
注意:模式是文件的属性,而不是流的属性
ifstream默认以in方式打开,而ofstream默认以out方式打开