C/C++基础复习(七)标准I/O库

C/C++ 2014年07月08日 ,

经过对C/C++函数的复习后,继续对标准IO库进行温习。http://furzoom.com/

C++的输入/输出由标准库提供。标准库定义了一族类型,支持对文件和控制窗口等设备的读写。还定义了其他一些类型,使string对象能够像文件一样操作。

标准I/O库

面向对象的标准库

I/O类型在三个独立的头文件中定义:

  1. 1.iostream定义读写控制窗口的类型;
  2. 2.fstream定义读写已命名文件的类型;
  3. 3.sstream定义读写内存中string对象类型。

IO标准库类型和头文件

Header Type
iostream istream从流中读取
ostream写到流中去
iostream对流进行读写:从istream和ostream派生而来
fstream ifstream从文件中读取:由istream派生而来
ofstream写到文件中去:由ostream派生而来
fstream读写文件:由iostream派生而来
sstream istringstream从string对象中读取:由istream派生而来
ostringstream写到string对象中去:由ostream派生而来
stringstream对string对象进行读写:由iostream派生而来

以上描述的流类读写都是由char类型组成的流。标准库还定义了一级相关的类型,支持wchar_t类型。每个类都加上w前缀,与char版本区分开来。他们分别是wostream、wistream、wiostream、wifstream、wofstream、wfstream、wistringstream、wostringstream、wstringstream。

IO对象不可复制或赋值。意味着:

  1. 1.流对象不能存储在vector容器中。因为只有支持复制的元素才能存储在vector或其他容器中。
  2. 2.形参或返回值不能为流类型。但可使用指针及引用。

条件状态

IO库管理一系列条件状态成员来标记IO对象的状态。

IO标准库的条件状态

条件状态 说明
strm::iostate 机器相关的整型名,由各个iostream类定义,用于定义条件状态
strm::badbit strm::iostate类型的值,用于指出被破坏的流
strm::failbit strm::iostate类型的值,用于指出失败的IO操作
strm::eofbit strm::iostate类型的值,用于指出流已经到达文件结束符
s.eof() 如果设置了流s的eofbit值,则该函数返回tru
s.fail() 如果设置了流s的failbit值,则该函数返回true
s.bad() 如果设置了流s的badbit值,则该函数返回true
s.good() 如果流s处于有效状态,则该函数返回true
s.clear() 将流s中的所有状态值都重设为有效状态
s.clear(flag) 将流s中指定条件状态设为有效。flag类型为strm::iostate
s.stestate(flag) 给流s添加指定条件状态。 flag类型为strm::iostate
s.rdstate() 返回流s的当前条件状态。返回值为strm::iostate

badbit对应于系统级的错误,如无法恢复的读写错误。可恢复的错误设置failbit标志。遇到文件结尾时会设置eofbit,同时设置failbit。如,

int ival;
// read cin and test only for EOF; loop is executed even if there are other IO failures
while(cin>>ival, !cin.eof())
{
    if (cin.bad())                      // input stream is corrupted; bail out
    {
        cerr<<“IO stream corrupted\n";
    }
    if (cin.fail())                     // bad input
    {
        cerr<<"bad data, try again\n";  // warn the user
        cin.clear();                    // reset condition values in stream
        cin.ignore();                   // jump the input
        continue;                       // get next input
    }
}

输出缓冲区的管理

每个IO对象管理一个缓冲区,用于存储程序读写的数据。

 fur << "Please enter a website: ";

系统将字符串字面值存储在与流fur关联的缓冲区中。下面几种情况将导致缓冲区的内家被刷新:

  1. 1.程序正常结束。作为main返回工作的一部分,将清空所有输出缓冲区;
  2. 2.在一些不确定的时候,缓冲区可以已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新;
  3. 3.用操作符显式地刷新缓冲区,例如行结束符endl;
  4. 4.在每次输出操作执行完后,用unitbuf操作符设置流的内部状态,从而清空缓冲区;
  5. 5.可将输出流与输入流关联起来。读输入流时将刷新其关联的输出缓冲区。

endl操作符,用于输出一个换行符并刷新缓冲区。flush不添加任何字符,刷新流。ends用于在缓冲区中插入空字符null,然后刷新它。

cout<< "furzoom" << flush;  // flushes the buffer; adds no data
cout<< "wordpress" << ends; // inserts a null, then flushes the buffer
cout<< "mn" << endl;        // inserts a newline, then flushes the buffer

unitbuf会在每次执行完写操作后都刷新流。如,

cout<< unitbuf<<"furzoom"<<"wordpress"<<nounitbuf;

等价于,

cout<<"furzoom"<<flush<<"wordpress"<<flush;

nounitbuf操作符将流恢复为使用正常的、由系统管理的缓冲区刷新方式。

文件的输入和输出

C++中的文件名使用C风格字符串。如,

string ifile = "in";
string ofile = "out";
//construct an ifstream and bind it to the file "in"
ifstream infile(ifile.c_str());
//construct an ofstream and bind it to the file "out"
ofstream outfile(ofile.c_str());

ifstream infile;    // unbond input file stream
ofstream outfile;   // unbond output file stream
infile.open("in");  // open file named "in"
outfile.open("out");// open tile named "out"

文件打开后要检验打开是否成功, 这是一个好习惯:

// check that the open succeeded
if (!infile)
{
    cerr << "error: unable to open input file: "<<ifile<<endl;
    return -1;
}

如果文件流不再使用或者需要与新的文件进行绑定,那么必须先关闭现在的文件。如,

ifstream infile("in");  // opens file named "in"
infile.close();         // closed "in"
infile.open("furzoom"); // opens file named "furzoom"

对文件流的关闭不能清除文件流的错误标志位,应该使用clear来清除后,再使用。

如果要重用文件流对多个文件进行读写,必须在读下一文件前使用clear清除该流的状态。
在撕开文件时,需要指定文件的文件模式

文件模式

文件模式 说明
in 打开文件做只读操作
out 打开文件做只写操作
app 在每次写之前找到文件尾
ate 打开文件后立即将定位在文件尾
trunc 打开文件时清空已存在的文件流
binary 以二进制模式进行IO操作

对于用ofstream打开的文件,要保存文件中存在的数据,唯一方法是显式地指定app模式打开。

默认情况下,fstream对象以in和out模式同时打开。当文件同时以in和out打开时不清空。只使用out模式,文件会被清空。

模式是文件的属性而不是流的属性。

打开文件的程序可以按如下的方式书写,

// opens in binding it to the given file
ifstream& open_file(ifstream &in, const string &file)
{
    in.close();           // close in case it was already open
    in.clear();           // clear any existing errors
    in.open(file.c_str());// open the file we were given
    return in;            // condition state is good if open succeeded
}

字符串流

stringstream特定的操作

stringstream操作 说明
stringstream strm; 创建stringstream对象
stringstream strm(s); 创建存储s副本的stringstream对象
strm.str() 返回strm中存储的string类型对象
strm.str(s) 将string类型的s复制给strm,返回void

stringstream对象的常见用法是,需要在多种数据类型之间实现自动格式化时使用该类类型。

Terms

base class

condition state

derived class

file mode

fstream

inheritance

object-oriented library

stringstream

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
日志标题:《C/C++基础复习(七)标准I/O库》
日志链接:http://furzoom.com/c-cplusplus-primetive-knowledge-7/
博客名称:枫竹梦

发表评论

插入图片

NOTICE1:请申请gravatar头像,没有头像的评论可能不会被回复!

回到顶部