C++ Primer第八章标准IO库笔记

  1. IO对象不可复制或赋值
    这有两个含义:
    1)由于流对象不能复制,则不能存储在vector(或其它)容器中(即不存在存储流对象的vector或其它容器).
    2)形参或返回类型不能为流类型,如果需要传递或者返回IO对象,则必须传递或返回指向该对象的指针或引用.
ofstream out1, out2;
// 错,不能赋值
out1 = out2;
// 错,参数为流类型(调用的时候就会执行复制操作了)
ofstream print(ofstream);
// 错,流对象的复制操作
out2 = print(out2);
// 对
ofstream &print(ofstream&);
while(print(out2)){...}
  1. 导致缓冲区的内容被刷新,即写入到真实的输出设备或文件的情况
    1)程序正常结束. 作为main返回工作的一部分,将清空所有的缓冲区
    2)在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新
    3)用操纵符显式的刷新缓冲区,例如行结束符endl;
// 刷新流,但不再输出中添加任何字符
cout << "hi!" << flush;
// 在缓冲区中插入空字符null,然后刷新缓冲区
cout << "hi!" << ends;
// 输出一个换行符并刷新缓冲区
cout << "hi!" << endl;

4)在每次输出操作执行完后,用unitbuf操纵符设置流的内部状态,从而清空缓冲区.

// unitbuf操纵符在每次执行完写操作后都刷新流,nounitbuf操纵符将流恢复为使用正常的、由系统管理的缓冲区刷新方式
cout << unitbuf << "first" << "second" << nounitbuf;
// 与上一条语句等价
cout << "first" << flush << "second" << flush;

5)可将输出流与输入流关联(tie)起来,在这种情况下,在读输入流时将刷新其关联的输出缓冲区.

// 绑定输入流和输出流
cin.tie(&cout);
// 获取指向输入流绑定的输出流的指针
ostream *old_tie = cin.tie();
// 解除绑定
cin.tie(0);
// 将输入流和错误流绑定
cin.tie(&cerr);
// 解除入流和错误流绑定
cin.tie(0);
// 将输入流和输出流绑定在一块
cin.tie(old_tie);

注:如果程序崩溃了,将不会刷新缓冲区

  1. 文件流对象的使用
//为ifstream或者ofstream对象提供文件名作为初始化式,就相当于打开了特定的文件
//ifile、ofile为文件名
ifstream infile(ifile.c_str());
ofstream outfile(ofile.cstr());
// 下面这种写法功能与上面一样
ifstream infile;
ofstream outfile;
// 调用open成员函数将已存在的fstream对象与特定文件绑定
infile.open("in");
outfile.open("out");

注:IO标准库使用C风格字符串,而不是C++ string类型的字符串作为文件名,在创建fstream对象时,如果程序从标准输入中获取文件名,比较好的方法是将文件名读入string对象,然后调用c_str()函数获取C风格字符串.

  1. 将文件流对象与新文件重新绑定
// fstream对象一旦打开,就保持与指定文件相关联,如果把fstream对象与另一个不同的文件关联,就必须先关闭现在的文件,然后打开一个新的文件.
ifstream infile("in");
infile.close();
infile.open("next");
  1. 清除文件流的状态
// 创建并重用流对象
ifstream input;
vector<string>::const_iterator it = files.begin();
while(it != files.end()){
	input.open(it->c_str());
	if(!input)){
		break;
	}
	while(input >> s){
		process(s);
	}
	// 关闭文件
	input.close(); 
	// 清除流状态,否则因为上一次对流的读操作到达了文件结束符或发生错误,接着在input上做的任何输入运算都会失败
	input.clear();
}
  1. 文件模式
  1. 同条件状态标志(true、false)一样,文件模式也是整型常量,在打开指定文件时,可用位操作符(与&、或|、异或^、取反~)设置一个或多个模式.
  2. 模式是文件的属性而不是流的属性
// in 打开文件做读操作
// out 打开文件做写操作.以out模式打开的文件会被清空,丢弃该文件中存储的所有数据
// app 在每次写之前找到文件尾
// ate 打开文件后立即将文件定义在文件尾
// trunc 打开文件时清空已存在的文件流
// binary 以二进制模式进行IO操作

// 下面两种写法等价
ofstream outfile("file1");
// 相应的二进制位做“或”操作,表示同时设置两种模式
ofstream outfile2("file1", ofstream::out | ofstream::trunc);

// append模式.在文件file2的末尾添加新数据
fstream appfile("file2", ofstream::app);

// 对同一个文件作输入和输出操作
// 当文件同时以in和out打开时不清空
// 当打开fstream所关联的文件时,只使用out模式,而不指定in模式,则文件会清空已存在数据
// 当打开文件时指定trunc模式,无论是否同时指定in模式,文件都会被清空
fstream inOut("file3", fstream::in | fstream::out);
  1. 打开模式的有效组合
    out                  打开文件做写操作,同时删除文件中已有的数据
    out | app        打开文件做写操作,在文件尾写入
    out | trunc      同out模式
    in                     打开文件做读操作
    in | out            打开文件做读写操作,并定位于文件开头处,但不清空.
    in |out | trunc   打开文件做读写操作,删除文件中已有的数据

  2. 字符串流

// 创建自由的stringstream对象
stringstream strm;
// 创建存储s副本的stringstream对象,其中s是string类型的对象
stringstream strm(s);
// 返回strm中存储的string类型的对象
strm.str();
// 将string类型的s复制给strm,返回void
strm.str(s);

// stringstream对象的使用
string line, word;
// 从输入中获取一行并存入到line中
while(getline(cin, line)){
	// 创建存储line副本的istringstream对象
	istringstream stream(line);
	// 读取行中的每个单词word
	while(stream >> word){
		...
	}
}

发布了89 篇原创文章 · 获赞 0 · 访问量 1025

猜你喜欢

转载自blog.csdn.net/qq_26496077/article/details/103994824