C++ Primer:第八章:IO库(续)
二:文件输入输出。
(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库(续)的更多相关文章
- 【C++ Primer | 08】IO库
IO类 C++的输入输出分为三种: (1)基于控制台的I/O (2)基于文件的I/O (3)基于字符串的I/O istringstream类 描述:从流中提取数据,支持 >> 操作 这里字 ...
- 第八章 IO库
8.1&&8.2 #include <iostream> #include <vector> #include <string> using nam ...
- 第 8 章 IO库
第 8 章 IO库 标签: C++Primer 学习记录 IO库 第 8 章 IO库 8.1 IO类 8.2 文件输入输出 8.1 string流 8.1 IO类 IO对象无拷贝或赋值,因此不能将形参 ...
- C++ Primer 读书笔记: 第8章 标准IO库
第8章 标准IO库 8.1 面向对象的标准库 1. IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream所定义的类型则用于 ...
- c++ primer 学习杂记3【标准IO库】
第8章 标准IO库 发现书中一个错误,中文版p248 流状态的查询和控制,举了一个代码例子: int ival; // read cin and test only for EOF; loop is ...
- 《C++ Primer》笔记 第8章 IO库
iostream定义了用于读写流的基本类型,fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型. 标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制 ...
- 【转载】C++ IO库
本篇随笔为转载,原贴地址:<C++ Primer>第8章 IO库 学习笔记. 1.IO类 #include <iostream> istream//从流中读取数据 ostrea ...
- c++标准之IO库
1.面向对象的标准库 2.多种IO标准库工具 istream,提供输入操作 ostream,提供输出操作 cin:读入标准输入的istream对象.全局对象extern std::istream ci ...
- [APUE]标准IO库(下)
一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中 ...
随机推荐
- Linux 常用
1,解决ssh登录慢的问题记录 vim /etc/ssh/ssh_config # GSSAPIAuthentication no 把下面这一行的注释去掉 2,Linux查看当前是什么系统 ...
- 大嫂的HTML
<html> <head> <style type="text/css"> *{ margin: 0; padding: 0; ...
- python视频教程:十分钟快速入门python
想要学习python这门语言,却始终找不到一个全面的Python视频教程,倘若你是真心想学好一门语言,小编建议你亲自动手实践的.下面来看看入门python的学习教程. Python的语言特性 Pyth ...
- IOS中nil/Nil/NULL的区别
类与对象的概念 类是对同一类事物高度的抽象,类中定义了这一类对象所应具有的静态属性(属性)和动态属性(方法). 对象是类的一个实例,是一个具体的事物. 类与对象是抽象与具体的关系. 类其实就是一种数据 ...
- Configuration for Python to run on Android
It's exiting to learn to make app on Android with python. But when I check <Head First Python> ...
- selectors实现高并发
1. 下面的例子,客户端给服务端发送消息,服务端把消息返回 server #!/usr/bin/env python import selectors import socket import tim ...
- What is hmux in resin?
When I start the Resin server it says hmux listening to localhost:6802 What is this hmux? Is this a ...
- 通过AssetsLibrary框架访问所有相片
该框架下有几个类,ALAssetsLibrary,ALAssetsGroup,ALAsset,ALAssetsFilter,ALAssetRepresentation. ALAssetsLibrary ...
- VS2010编译Qt5.4.0静态库
http://www.kavenblog.com/?p=375 1.Qt的跨平台十分优秀,但是在Windows上是还是会有许多问题,其中之一就是动态链接库的问题,Qt程序的发布必须带一个体积不小的DL ...
- hdu - 2083 - 简易版之最短距离
找到中位数 , 根据对称性 , 当中位数需要两个数取中值的时候不需要取 , 只需要其中的任意一个数几个 例如四个数 1 , 2 , 3 , 4 . 这四个数 , 其中的 2 和 3 都可以 . 然后求 ...