二:文件输入输出。

(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. Pjax的使用

    什么是pjax? 现在很多网站( facebook,  twitter)都支持这样的一种浏览方式, 当你点击一个站内的链接的时候, 不是做页面跳转, 而是只是站内页面刷新. 这样的用户体验, 比起整个 ...

  2. No module ata_piix found的解决方法

    在一台as4u6的机器上升级内核到2.6.18时,最好make install的时候报了一个WARNING: No module ata_piix found for 2.6.18, 开始没有在意,重 ...

  3. 8种主要排序算法的C#实现

    作者:胖鸟低飞 出处:http://www.cnblogs.com/fatbird/ 简介 排序算法是我们编程中遇到的最多的算法.目前主流的算法有8种. 平均时间复杂度从高到低依次是: 冒泡排序(o( ...

  4. Enumeration 接口

    Enumeration是遍历集合元素的一种方法. Enumeration中只有两个方法: 1.hasMoreElements()  测试此枚举是否包含更多的元素. 2.nextElement()  如 ...

  5. checkbox的全选、反选、删除(适配器)

    package com.example.adapter; import java.util.List; import com.example.ay.R;import com.example.vo.Fl ...

  6. matlab图形句柄属性总结

    原文在于雪漫的bloghttp://blog.sina.com.cn/s/blog_4b9b714a0100cce2.html这两天在看句柄式图形方面的东西,以下是我在看书过程中整理的学习笔记,比较详 ...

  7. STM32之GPIO端口位带操作

    #ifndef __SYS_H #define __SYS_H #include "stm32f10x.h" //位带操作 //把“位带地址+位序号”转换别名地址宏 #define ...

  8. 转:Java面试题集(1-50)

    Java程序员面试题集(1-50) http://blog.csdn.net/jackfrued/article/details/17403101 一.Java基础部分 1.面向对象的特征有哪些方面? ...

  9. ZOJ 1654 - Place the Robots (二分图最大匹配)

    题意:在一个m*n的地图上,有空地,草和墙,其中空地和草能穿透攻击光线,而墙不能.每个机器人能够上下左右攻击,问在地图上最多能放多少个不互相攻击的机器人. 这个题和HDU 1045 -  Fire N ...

  10. (转)经典收藏 50个jQuery Mobile开发技巧集萃

    (原)http://www.cnblogs.com/chu888chu888/archive/2011/11/10/2244181.html 经典收藏 50个jQuery Mobile开发技巧集萃   ...