二:文件输入输出。

(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. visual studio 2013连接Oracle 11g并获取数据:(二:实现)

    1.VS中新建一个winform窗体 (1)一个按钮 (2)一个数据表格视图(在里面显示得到的数据表) 2.双击按钮进入代码 (1)添加 using System.Data.OracleClient; ...

  2. C#Base64编码

    一. Base64的编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24 位数据,再把这24位数据 ...

  3. 根据窗体自动调整控件及文本框记住上次填写内容Demo

    第一次写文章,组词难免没有不通之处... 最近常用到Winform根据窗体大小自动调整空间大小及字体.文本框记住上次填写内容待下次输入某一段时候自动跳出上次输入内容.于是就随便把两个问题放到同一个de ...

  4. tomcat http 文件下载

    tomcat作为http的下载服务器,网上有很多办法 但我认为最简单的是: 1.直接把文件放在 tomcat6/webapps/ROOT 目录下, 2.然后在网址中访问: http://120.194 ...

  5. linux下一键安装 powershell,的bash脚本

    说明 目前,linux下的powershell约等于pash.希望大家专注mono,关注pash. 一键安装脚本包括for centos6,centos7,ubuntu 14.04  ubuntu 1 ...

  6. PHP及Javascript 正则判断中文(转)

    UTF-8匹配: 在javascript中,要判断字符串是中文是很简单的.比如: var str = "php编程"; if (/^[\u4e00-\u9fa5]+$/.test( ...

  7. 欢迎参加MVP主讲的Windows 10开发线上课程

    博客地址:http://blog.csdn.net/FoxDave Windows 10 Developer Readiness - Powered by MVPs - 由微软最有价值专家(MVP)主 ...

  8. javascript预解析和作用域

    JavaScript解析过程分为两个阶段: 一是:编译阶段.就是JavaScrip预解析阶段,在这个阶段JavaScript解析器将完成把JavaScript脚本代码转换到字节码; 二是:执行阶段.在 ...

  9. T-sql语句

    在用代码编辑数据库时,首先要启动WAMPSERVER 1.创建表 create table Car ( Code varchar(50) primary key , Name varchar(50) ...

  10. asp中cookie欺骗/注入原理与防范

     一直以来sql注入被广泛关注,也有专门的防注系统代码.发现,如果代码不严谨也会有cookie欺骗/注入的情况.原来, 防注入系统没有注意到 Cookies 的问题!这里以ASP为例,分析一下cook ...