二:文件输入输出。

(1) 使用文件流对象:
头文件fstream定义了三个类型来支持文件IO:ifstream从一个给定的文件中读取数据,ofstream向一个给定的文件中写入数据,以及fstream可以读写给定文件。
这些类型提供的操作和cin、cout的操作一样,我们可以用<<和>>来读写文件,可以用getline从一个ifstream读取数据。
fstream头文件还定义了其他的操作:
fstream fstrm;// 创建一个未绑定的文件流,fstream是fstream头文件中定义的一个类型
fstream fstrm(s);// 创建一个fstream,并打开名为s的文件,s可以是string类型,也可以是指向C风格字符串数组的指针,默认的文件模式mode依赖于fstream的类型,这些构造函数都是explicit的
fstream fstrm(s, mode);// 与上一个类似,但按指定的mode打开文件
fstrm.open(s);// 打开名为s的文件,并将文件与fstrm绑定,函数返回void。
fstrm.close();// 关闭与fstrm关联的文件,返回void
fstrm.is_open();// 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
使用文件流对象:
我们要读写文件时,可以定义一个文件流对象,创建对象时,我们可以提供文件名(可选的),如果提供了一个文件名,则open成员函数会自动被调用:
ifstream  in(infile); // 构造一个ifstream对象并打开给定名为infile的文件
<pre>ofstream out; // 输出文件未关联任何文件

如果我们定义了一个空文件流对象,即定义对象但未关联文件。可以随后调用open成员函数来关联到一个文件:
ifstream  in(ifile); // 构造一个ifstream对象并打开给定名为ifile的文件
ofstream out; // 输出文件未关联任何文件
out.open(ifile + ".copy"); //打开指定文件
如果调用open失败,failbit会被置位。进行open是否成功的检测通常是一个比较好的习惯:
if (out) // 检查open是否成功
//... open成功,可以使用文件了
这个判断条件和我们判断cin类似。
实际上,对一个已打开的文件流调用open会失败,倒置failbit被置位。随后试图使用文件流的操作都将失败!因此我们要将流对象和文件关联起来时,必须首先确定关闭已经关联的文件,然后再关联新的文件:
in.close();  // 关闭文件
in.open(ifile + "2"); // 打开另外一个文件
当一个fstream对象被销毁时,close成员函数自动被调用!
(2). 文件模式(mode)
每个流都有一个关联的文件模式,用来指出如何使用文件:
in 以读方式打开
out 以写方式打开
app 每次写操作前均定位到文件末尾
ate 打开文件后立即定位到文件末尾
trunc 截断文件
binary 以二进制方式进行IO
指出文件模式有如下限制:
# 只可以对ofstream或fstream对象设定out模式;
# 只可以对ifstream或fstream对象设定in模式;
# 只有当out也被设定时才可以设定trunc模式;
# 只要trunc没被设定,就可以设定app模式。在app模式下,即使没有显示指定out模式,文件也总是以输出方式被打开
# 默认情况下,即使没有指定trunc模式,以out模式打开的文件也被截断。我们可以必须同时指定app模式才可以保留以out模式打开的文件的内容,这样只会将数据追加到文件末尾; 或者同时指定in模式,同时读写。
# atr和binary模式可用于任何类型的文件流对象。
每个流类型都定义了一个默认的文件模式,ifstream关联的文件以in模式打开,ofstream关联的文件以out打开,fstream关联的文件以in和out打开。
阻止一个ofstream清空文件内容的方式是同时指定app或in模式:
std::ofstream out("test.txt", std::ofstream::out | std::ofstream::app);
<pre name="code" class="cpp" style="font-weight: bold;">std::ofstream out("test.txt", std::ofstream::out | std::ofstream::in);

对于一个给定流,每次打开文件时,都可以改变其文件模式:
同样的,我们可以同时指定app模式,来阻止out调用open时清空文件内容的情况:
out.open("test.txt", std::ofstream::app);
如果在open一个文件时未指定文件模式,则使用默认值。
三、string流
sstream头文件定义了三个类型来支持内存IO。
istringstream从string中读取数据,ostringstream向string写入数据,stringstream可以进行读或写。
sstream strm; // strm未绑定文件,sstream是一个stringstream对象(下同)
sstream strm(s); // strm保存string s的一个拷贝,此构造函数时explict的
strm.str(); // 返回strm保存的string对象的拷贝
strm.str(s); // 将string s拷贝到strm中,返回void
使用istringstream
string line,word;
while (getline(cin,line))
{
istringstream stream(line); while (stream >> word)
{
// do per-word ...
}
}
将一个istringstream对象与所读取的行绑定起来,这样只需使用普通的string输入操作符即可读出每行中的单词。
而ostringstream和它使用类似。

C++ Primer:第八章:IO库(续)的更多相关文章

  1. 【C++ Primer | 08】IO库

    IO类 C++的输入输出分为三种: (1)基于控制台的I/O (2)基于文件的I/O (3)基于字符串的I/O istringstream类 描述:从流中提取数据,支持 >> 操作 这里字 ...

  2. 第八章 IO库

    8.1&&8.2 #include <iostream> #include <vector> #include <string> using nam ...

  3. 第 8 章 IO库

    第 8 章 IO库 标签: C++Primer 学习记录 IO库 第 8 章 IO库 8.1 IO类 8.2 文件输入输出 8.1 string流 8.1 IO类 IO对象无拷贝或赋值,因此不能将形参 ...

  4. C++ Primer 读书笔记: 第8章 标准IO库

    第8章 标准IO库 8.1 面向对象的标准库 1. IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream所定义的类型则用于 ...

  5. c++ primer 学习杂记3【标准IO库】

    第8章 标准IO库 发现书中一个错误,中文版p248 流状态的查询和控制,举了一个代码例子: int ival; // read cin and test only for EOF; loop is ...

  6. 《C++ Primer》笔记 第8章 IO库

    iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型. 标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制 ...

  7. 【转载】C++ IO库

    本篇随笔为转载,原贴地址:<C++ Primer>第8章 IO库 学习笔记. 1.IO类 #include <iostream> istream//从流中读取数据 ostrea ...

  8. c++标准之IO库

    1.面向对象的标准库 2.多种IO标准库工具 istream,提供输入操作 ostream,提供输出操作 cin:读入标准输入的istream对象.全局对象extern std::istream ci ...

  9. [APUE]标准IO库(下)

    一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中 ...

随机推荐

  1. redis学习(一)

    一.redis简介 Redis是基于内存.可持久化的日志型.key-value高性能存储系统.关键字(Keys)是用来标识数据块.值(Values)是关联于关键字的实际值,可以是任何东西.有时候你会存 ...

  2. Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)

    利用Matlab与VC++联合编程,既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数,也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度.缩短开 ...

  3. ios 检测应用程序升级问题

    app 上其实已经有自动检测我们版本的功能.  其实我也觉得对于一个程序员来说检测功能让,系统来维护更合适和合理.开发者只要告诉苹果即可. 然而今天老大非要实现自己版本更新的问题,因此也查找了相关的资 ...

  4. HYSBZ 1858 线段树 区间合并

    //Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...

  5. operation not possible due to RF-kill

    使用mdk3时出现这个问题operation not possible due to RF-kill 就是输入第一条命令 后出现 operation not possible due to RF-ki ...

  6. 使用开源工具MonoDevelop开发GTK#图形界面

    转自:http://developer.51cto.com/art/201011/235040.htm Mono一直到现在的2.8已经完全可以胜任一些比较小的项目了,但相关的开发文档与教程一直比较匮乏 ...

  7. (转)JS浮动窗口(随浏览器滚动而滚动)

    原文:http://hi.baidu.com/aiyayaztt/item/4201c55a6b729dced2e10c79 JS浮动窗口(随浏览器滚动而滚动) 往往用于一些联系方式,互动平台模块,随 ...

  8. Note_Master-Detail Application(iOS template)_07_ YJYDetailViewController.m

    //  YJYDetailViewController.m #import "YJYDetailViewController.h" @interfaceYJYDetailViewC ...

  9. 如何实现标准TCODE的屏幕增强

    如何实现标准TCODE的屏幕增强(HOWTO:Implement a screen exit to a standard SAP transaction) Introduction SAP provi ...

  10. struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)

    我的前台页是这样的: <body>      <form action="test.action" method="post">     ...