7、C++ Primer 4th 笔记,标准IO库(2)-阿里云开发者社区

开发者社区> 开发与运维> 正文

7、C++ Primer 4th 笔记,标准IO库(2)

简介: 1、文件的输入输出 由于历史原因,IO 标准库使用 C 风格字符串而不是 C++strings 类型的字符串作为文件名。 如果要把fstream对象与另一个不同的文件关联,则必须先关闭(close)现在的文件,然后打开(open)另一个文件。

1、文件的输入输出

由于历史原因,IO 标准库使用 C 风格字符串而不是 C++strings 类型的字符串作为文件名。

如果要把fstream对象与另一个不同的文件关联,则必须先关闭(close)现在的文件,然后打开(open)另一个文件。

2、读文件中文件流的状态

如果程序员需要用文件流读写多个文件,必须在读另一个文件之前调用clear清除该流的状态。

示例程序

// for each file in the vector
while (it != files.end()) {
	ifstream input(it->c_str()); // open the file;
	// if the file is ok, read and "process" the input
	if (!input)
		break; // error: bail out!
	while(input >> s) // do the work on this file
		process(s);
	++it; // increment iterator to get
	next file
}
//check out the difference between these two programs.
ifstream input;
vector<string>::const_iterator it = files.begin();
// for each file in the vector
while (it != files.end()) {
	input.open(it->c_str()); // open the file
	// if the file is ok, read and "process" the input
	if (!input)
		break; // error: bail out!
	while(input >> s) // do the work on this file
		process(s);
	input.close(); // close file when we're done with it
	input.clear(); // reset state to ok
	++it; // increment iterator to get next file
}

3、文件模式

每个fstream类都定义了一组表示不同模式的值,用于指定流打开的不同模式,与条件状态标志一样,文件模式也是整形常量,在打开指定文件时,可用位操作符,设置多个模式。

表示 打开模式

in

打开文件做读操作

out

打开文件做写操作

app

在每次写之前找到文件尾

ate

打开文件后立即将文件定位在文件尾

trunc

打开文件时清空已存在的文件流

binary

以二进制模式进行IO操作

    outtrunc app 模式只能用于指定与 ofstream fstream 对象关联

的文件;in 模式只能用于指定与 ifstream fstream 对象关联的文件。所有

的文件都可以用 ate binary 模式打开。ate 模式只在打开时有效:文件打

开后将定位在文件尾。以 binary 模式打开的流则将文件以字节序列的形式处

理,而不解释流中的字符。

out模式打开的文件会被清空。当文件同时以in,out打开时不清空。

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

表示 打开模式的有效组合

out

打开文件做写操作,删除文件中已有的数据

out | app

打开文件做写操作,在文件尾写入

out | trunc

out 模式相同

in

打开文件做读操作

in | out

打开文件做读、写操作,并定位于文件开头处

in | out | trunc

打开文件做读、写操作,删除文件中已有的数据

4、字符串流

表示 字符串流的操作

stringstream strm;

创建自由的 stringstream 对象

stringstream strm(s);

创建存储s的副本的stringstream对象,其中sstring类型的对象

strm.str()

返回 strm 中存储的 string 类型对象

strm.str(s)

string 类型的 s 复制给 strm,返回 void

字符串流的经典操作示例

string line, word; // will hold a line and word from input,respectively
while (getline(cin, line)) 
{ // read a line from theinput into line
		// do per-line processing
	istringstream stream(line); // bind to stream to the line we read
		while (stream >> word)
		{ // read a word from line
			// do per-word processing
		}
}

1stringstream提供的转换和格式化

    stringstream 对象的一个常见用法是,需要在多种数据类型之间实现自动格式化时使用该类类型。sstream 输入和输出操作可自动地把算术类型转化为相应的

string表示形式,反过来也可以。

典型示例

int val1 = 512, val2 = 1024;
ostringstream format_message;
// ok: converts values to a string representation
format_message << "val1: " << val1 << "\n"
               << "val2: " << val2 << "\n";
//the following is how to read
//str member obtains the string associated with a stringstream
istringstream input_istring(format_message.str());
string dump; // place to dump the labels from the formatted message
// extracts the stored ascii values, converting back to arithmetic types
input_istring >> dump >> val1 >> dump >> val2;
cout << val1 << " " << val2 << endl; // prints 512 1024

为了读取input_string,必须把该string对象分解成若干部分,必须读取和忽略处于所需数据周围的标号。因为输入操作符读取的是有类型的值,因此读入的对象类型必须和由stringstream 读入的值的类型一致。一般情况下,使用输入操作符读string时,空白符将会忽略。

参考:

[1] http://blog.163.com/zhoumhan_0351/blog/static/39954227201002945157577/

[2] http://blog.163.com/zhoumhan_0351/blog/static/39954227201003005237697/

[3] http://blog.163.com/zhoumhan_0351/blog/static/399542272010030103055465/

[4] http://blog.163.com/zhoumhan_0351/blog/static/39954227201002192139554/

[5] http://blog.163.com/zhoumhan_0351/blog/static/3995422720103171303182/

[6] 深入输入输出流

http://blog.163.com/zhoumhan_0351/blog/static/399542272010495432659/

http://blog.163.com/zhoumhan_0351/blog/static/39954227201032392545410/

版权声明:本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已升级为阿里云开发者社区。如果您发现本文中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章