您的位置:首页 > 编程语言 > C语言/C++

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

2016-05-20 21:19 316 查看
///检测输入/输出的状态标志
///标志(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
}
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: