C++ Primer学习之(8)——标准IO库

标准IO库一直是我薄弱的部分,现在对文件的操作还在用C员的file那一套,很有必要好好读这一章。

P379:

我们不但没有涉及系统特定的实现细则,也不讨论标准库管理输入输出缓冲区的机制,以及如何编写自定义的缓冲区类。

注:编写自定义的缓冲区类,对这个倒挺感兴趣的,有时间可以查查相关的资料。


P390:

IO类型在三个独立的头文件中定义:

iostream定义读写控制窗口的类型

fstream定义读写已命名文件的类型

sstream定义的类型则用于读写存储在内存中的string对象


P382:

迄今为止所描述的流类(stream class)读写的都是由char类型组成的刘。此外,标准库还定义了一组相关的类型,支持wcha_t类型。每个类都加上'w'前缀,以此与char类型的版本区分开来。

于是,wostream,wistream和wiostream类型从控制窗口读写wchar_t数据。

文件输入输出类是wifstream,wofstream和wfstream。

string输入/输出流则是wistringsstream,wostringstream和wstringstream。

标准输入对象时wcin;标准输出是wcout;标准错误则是wcerr。

注:必须惭愧地承认又一次看到一个ifstream类型迷茫了,其实也不是什么高深的东东,只是不熟悉也不好学,检讨一下。


P387

输出缓冲区的管理

下面几种情况将导致缓冲区的内容被刷新,即写入到真实的输出设备或者文件:

1. 程序正常结束。作为main返回工作的一部分,将清空所有输出缓冲区。

2. 在一些不确定的时候,缓冲区可能已经满了,这时,缓冲区将会在写入下一个值之前刷新。

3. 用操纵符显式地刷新缓冲区,例如行结束符endl。

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

5. 将输出流与输入流关联起来。这时在读输入流时将刷新其关联的输出缓冲区。

endl用于输出一个换行符并刷新缓冲区,还有两个类似的操纵符,第一个是flush,用于刷新流,但不在输出中添加任何字符。第二个是较少用的ends,在缓冲区中插入空字符null,然后刷新它。

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

警告:如果程序崩溃了,则不会刷新缓冲区

为了确保用户看到程序实际上处理的所有输出,最好的方法是保证所有的输出操作都显式地调用了flush或endl。输出时应多使用endl而非'\n'。


P389:

将输入和输出绑在一起

交互式系统通常应确保它们的输入和输出流是绑在一起的。这样做意味着可以保证任何输出,包括给用户的提示,都在试图读之前输出。


P391:

警告:C++中的文件名

IO标准库使用C风格字符串而不是C++ strings类型的字符串作为文件名。在创建fstream对象时,如果调用open或使用文件名作初始化式,需要传递的实参应为C风格字符串,而不是标准库strings对象。通常,比较好的方法是将文件名读入string对象,而不是C风格字符数组。假设要使用的文件名保存在string对象中,则可调用c_str成员获取C风格字符串。


P393:

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


P395:

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

// output mode by default; truncates file named "file1"
ofstream outfile("file1");
// equivalent effect: "file1" is explicitly truncated
ofstream outfile2("file1", ofstream::out | ofstream::trunc);
// append mode; adds new data at end of existing file named "file2"
ofstream appfile("file2", ofstream::app);

P396:

只要调用open函数,就要设置文件模式,其模式的设置可以是显式地也可以是隐式的。如果没有指定文件模式,将使用默认值。


P397:

文件模式的组合

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

out | app:打开文件做写操作,在文件尾写入

out | trunc:与out模式相同

in:打开文件做读操作

in | out:打开文件做读、写操作,并定位与文件开头处

in | out | trunc:打开文件做读、写操作,删除文件中已有的数据

上述模式组合还可以添加ate模式。ate只会改变文件打开时的初始化定位,在第一次读或写之前,将文件定位与文件末尾处。


P398:

sstream类型除了继承iostream的操作外,还定义了一个有string形参的构造函数,这个构造函数将string类型的实参复制给stringstream对象。

stringstream特定的操作

stringstream strm:创建自有的stringstream对象;

stringstream strm(s):创建存储s的副本的stringstream对象,其中s是string类型的对象;

strm.str():返回strm中存储的string类型对象

strm.str(s):将string类型的s复制给strm,返回void

stringstream提供的转换和/或格式化

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";
相反,用istringstream读string对象,即可重新将数值型数据找回来。

// 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 assii values, converting back to arithmetic types
input_istring >> dump >> val1 >> dump >> val2;
为了读取input_string,必须把该string对象分解为若干个部分。我们要的是数值型数据;为了得到,必须取得(和忽略)处于所需数据周围的标号。

注:使用stringstream进行格式转换在实际过程中用过,读这段之前写的代码非常ugly,虽然功能实现了,可是是靠拼凑完成的。读完对stingstream的用法了然。

第八章 标准IO库(完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值