C++ 文件输入输出(四)

来源:互联网 发布:全球互联网大会 知乎 编辑:程序博客网 时间:2024/06/05 11:53
///检测输入/输出的状态标志///标志(flags)”标志在C++中的含义。///C++中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息。这些当前的状态信息///被包含在///io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值(译注:表中///第一列为枚举值的名称,第二列为该值相应含义的描述):/*godbit无错误Eofbit已到达文件尾failbit非致命的输入/输出错误badbit致命的输入/输出错误 *////有两种方法可以获得输入/输出的状态信息。一种方法是通过调用rdstate()函数,它将返回当前状态的错///误标记(上表中提到的)。例如,假如没有任何错误,则rdstate()会返回goodbit.///另一种方法则是使用下面任何一个函数来检测相应的输入/输出状态:/*bool bad();bool eof(); //还记得它么?“不断读取文件内容直到到达文件末尾!”bool fail(); //噢,这也是老朋友……检测一个打开操作是否成功bool good();*////假如badbit标志被标设(译注:原文为“If the badbit flag is up”,这里将“is up”译为“标设”,///意即出现了badbit对应的错误,badbit状态被置为当前的错误状态,下同),则bad()函数返回true;///假如failbit标志被标设,则fail()函数返回true;假如没有错误发生(goodbit标志被标设),///则good()函数返回true;假如操作已经到达了文件末尾(eofbit被标设),则eof()函数返回true.///如果错误发生,你必须清除这些错误状态,以使你的程序能正确适当地继续运行——如果你这么打算的话。///要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值。///假使你想让你的程序“清清爽爽”地运行下去,只要将ios::goodbit作为实参。你将在以下内容中看到示例///代码。/*示例1:简单的状态检测///实际应用中可将 FileStream替换成你相应在使用的文件流句柄    if(FileStream.rdstate() == ios::eofbit)       cout << "End of file!/n";    if(FileStream.rdstate() == ios::badbit)       cout << "Fatal I/O error!/n";    if(FileStream.rdstate() == ios::failbit)       cout << "Non-fatal I/O error!/n";    if(FileStream.rdstate() == ios::goodbit)        cout << "No errors!/n";*////示例2:clear()函数///#include<iostream>#include <fstream>using namespace std;int main(){    ///ofstream File1("file3.txt"); //建立file3.txt    ///File1.close();    //下面的检测代码将会返回错误,这是因为我使用了ios::noreplace打开模式    //它模式在试图打开一个已存在的文件时会返回错误    ofstream Test("file3.txt",ios_base::in);    //上一行将导致ios::failbit错误,我们这就将其演示出来    if(Test.rdstate() == ios::failbit)       cout << "Error...!/n";    Test.clear(ios::goodbit); //将当前状态重置为ios::goodbit    if(Test.rdstate() == ios::goodbit) //检测程序是否已经正确地施行了设置       cout << "Fine!/n";    Test.clear(ios::eofbit); //将状态标志设为ios::eofbit. 无实际用途.    if(Test.rdstate() == ios::eofbit) //检测是否已经正确地施行了设置       cout << "EOF!/n";    Test.close();    return 0;}///除了使用标记值判断,你也可以使用函数(译注:指bad()、eof()、fail()、good()这些函数)///的形式进行判断,两者实际上是一样的——都是检测某个标记是否被标设。/*The ios::nocreate setting did not make it into the ISO 14882:1998 C++        standard. Too platform specific.        You can simulate that behavior with:     fstream foo("foo.txt", ios_base::in);     if(!fs)    {        // File does not exist.        // Do not create one.    }    else    {        foo.close();        foo.open("foo.txt", ios_base:ut);    }ios::nocreate:打开一个已有的文件,如文件不存在,则打开失败,nocreate的意思是不建立新文件ios::noreplace:如果文件不存在则建立新文件,如果文件已存在则操作失败,noplace的意思是不建立新文件在新版本的C++系统I/O类库中不提供ios::nocreate和ios::noreplace用ios_base::in|ios_base::out可做判断*//*fstream fs(“fname”, ios_base::in);// attempt open for readif (!fs){  // file doesn't exist; don't create a new one}else //ok, file exists. close and reopen in write mode{  fs.close();  fs.open(“fname”, ios_base::out); // reopen for write}You can just do the opposite for ios::noreplace:fstream fs(“fname”, ios_base::in);// attempt open for readif (!fs){ // file doesn't exist; create a new one fs.open(“fname”, ios_base::out);}else //ok, file exists; close and reopen in write mode{ fs.close() fs.open(“fname”, ios_base::out); // reopen for write}*/

0 0
原创粉丝点击