C++ 文件输入输出(四)
2016-05-20 21:19
363 查看
///检测输入/输出的状态标志 ///标志(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 read if (!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 read if (!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 } */
相关文章推荐
- C++运算符重载
- C++虚函数
- 【LeetCode-191】 Number of 1 Bits(C++)
- C语言程序代码编写规范
- Box2D C++ 教程-用户数据
- C/C++中虚函数的调用
- C++的函数的重载
- C++的继承
- C语言编译原理简介
- C++的类
- C语言单链表实现19个功能完全详解
- C++第7次上机实验
- 用c++实现单向链表和双向链表
- C++基础语法
- 第六次c++作业
- leetcode - Merge Sorted Array (run time beats 100.00% of cpp submissions.)
- malloc与free的配对使用的注意
- c语言中出现左操作数必须是左值(摘抄)
- C++程序错误集锦,如:thiscall,_tmain已经定义,重载,未定义的标识符
- c++模版应用实例