C++ IO库基本操作

IO类

为了支持不同种类的IO操作,除了istream和ostream之外,标准库还制定了一些其他的IO类型


头文件iostream

// w开头表示宽字符版对象
istream		wistream	//从流中读取数据
ostream		wostream	//向流中写数据
iostream	wiostream	//读写流

头文件fstream

// w开头表示宽字符版对象
ifstream	wifstream	//从文件读取数据
ofstream	wofstream	//向文件写数据
fstream		wfstream	//读写文件

头文件sstream

// w开头表示宽字符版对象
istringstream	wistringstream	//从string中读取数据
ostringstream	wostringstream	//向string中写数据
stringstream	wstringstream	//读写string

IO类型之间的关系
概念上设备类型和字符大小都不会影响我们要执行的IO操作,例如我们可以用 >> 读取数据,而不用管是从一个控制台窗口,一个磁盘文件,还是一个string读取。类似的,我们也不用管读取的字符能存入一个 char 对象内,还是需要一个 wchar_t 对象来存储。标准库使我们能忽略这些不同类型流的差异,这是通过继承机制实现的。
类型 ifstream 和 istringstream 都是继承自 istream 的,因此我们可以像使用 istream 一样来使用 ifstream 和 istringstream,也就是说我们如何使用 cin 的,就能同样的使用这些类型的对象。

IO对象无拷贝或赋值

我们不能拷贝或者对IO对象赋值

ofstream out1, out2;
out1 = out2;    //错误,不能对流对象赋值
ofstream print(ofstream);   //错误,不能初始化ofstream对象
out2 = print(out)   //错误,不能拷贝流对象

由于不能拷贝流对象,因此我们也不能将形参或者返回类型设置为流类型,通常是以引用方式传递和返回流,读写一个流对象会改变其值,因此这种引用不能是const的

条件状态

IO操作有时可能会发生错误,下面列出了一些IO类定义的函数和标志,可以帮助我们访问和操纵流的条件状态

函数标志含义
strm::iostate机器相关类型,提供了表达条件状态的完整功能
strm::badbit用来指出流已崩溃
strm::falibit指出一个IO操作失败了
strm::eofbit指出流已到达文件结束
strm::goodbit用来指出流未处于错误状态。此值保证为0
s.eof()若s的eofbit置位,返回true
s.fail()若s的failbit或者badbit置位,返回true
s.bad()若s的badbit置位,返回true
s.good()若流s处于有效状态,返回true
s.clear()将流s的所有条件状态位复位,将流设为有效状态,返回void
s.clear(flags)根据给定的flag标志位,将s对应状态位复位,falg的类型为strm::iostate,返回void
s.rdstate()返回流当前状态,返回类型为strm::iostate

文件输入输出

头文件fstream定义了三个类型来支持文件IO:
ifstream从一个给定文件读取数据;
ofstream向一个给定文件写数据;
fstream从一个给定文件读写数据;
这些类型都是继承自iostream,因此我们可以像cin,cout一样操作这些类型,特别的我们可以用 >> 和 << 来读写文件,还可以使用getline从一个ifstream读取数据。
下表列出了一些fstream的特有操作

操作含义
fstream fstrm创建一个未绑定的文件流。fstream是头文件fstream中定义的一种类型
fstream fstrm(s)创建一个fstream,并且打开文件名为s的文件。s可以是string类型,或者是一个指向c风格字符串的指针
fstream fstrm(s,mode)按指定mode打开文件
fstrm.open(s)打开名为s的文件,并且将文件与fstrm绑定。s可以是一个指向c风格字符串的指针或是string类型,返回void
fstrm.close(s)关闭fstrm绑定的文件,返回void
fstrm.is_open(s)返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭

文件模式mode

模式含义
in以读方式打开
out以写方式打开
app每次写操作前均定位到文件末尾
ate打开文件后立即定位到文件末尾
trunc截断文件
binary以二进制方式进行IO

限制

  • 只可以对ofstream或fstream对象设定out模式
  • 只可以对ifstream和fstream对象设定in模式
  • 只有当out设定时才可以设置trunc模式
  • 只要trunc模式没被设定,就可以设定app模式。在app模式下,即使没有显式指定out模式,文件也总是以输出方式被打开
  • 默认情况下,即使我们没有指定trunc,以out模式打开的文件也会被截断,为了保留以out模式打开文件的内容,我们必须同时指定app模式,这样只会把数据追加带文件末尾;或者同时指定in模式,即打开文件同时进行读写操作。
  • ate和binary模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用

每个文件流类型都定义了一个默认的文件模式,当我们未指定文件模式时就默认以此文件模式打开。与ifstream关联的文件默认以in方式打开;与ofstream关联的文件默认以out模式打开;与fstream关联的文件默认以in和out打开。

文件流对象的使用

// read函数
istream &read(istream &is, Sales_data &item)
{
    double price=0;
    is >> item.bookNO >> item.units_sold >> price;
    item.revenue = price*item.units_sold;
    return is;
}

// print函数
ostream &print(ostream &os, const Sales_data &item)
{
    os << item.isbn() << " " << item.units_sold << " "
       << item.revenue << " " << item.avg_price();
    return os;
}
ifstream input(argv[1]);    //打开销售记录文件
ofstream output(argv[2]);   //打开输出文件
Sales_data total;
if (read(input, total))
{
    Sales_data trans;
    while(read(read, trans)){
        if (total.isbn() == trans.isbn()){
            total.combine(trans);
        }
        else{
            print(output, total) << endl; //向输出文件写入数据
            total = trans;
        }
    }
    print(output, total) << endl;   //向输出文件写入数据
}else
    cerr << "No data?" << endl;

string流

头文件sstream定义了三个类型来支持文件IO:
istringstream从一个给定string读取数据;
ostringstream向一个string写数据;
stringstream从一个string读写数据;
特有操作

操作含义
sstream strm定义一个未绑定的sstring对象
sstream strm(s)strm是一个sstring对象,保存string s的一个拷贝
strm.str()返回strm保存的string拷贝
strm.str(s)将string s拷贝到strm中,返回void

用法

string s,a;
getline(cin, s);
istringstream record(s);
while (record >> a)
    cout << a << endl;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 一、ASCII 输出   为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstream>取 代< fstream.h>,所有的C++标准头文件都是无后缀的。)。这是 <iostream.h>的一个扩展集, 提供有缓 冲的文件输入输出操作. 事实上, <iostream.h> 已经被<fstream.h>包含了, 所以你不必包含所有这两个 文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O 操作。如果你猜是"fstream," 恭喜你答对了! 但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。   如果你用过标准控制台流"cin"?和 "cout," 那现在的事情对你来说很简单。 我们现在开始讲输出部 分,首先声明一个类对象。 ofstream fout;   这就可以了,不过你要打开一个文件的话, 必须像这样调用ofstream::open()。 fout.open("output.txt");   你也可以把文件名作为构造参数来打开一个文件. ofstream fout("output.txt");   这是我们使用的方法, 因为这样创建和打开一个文件看起来更简单. 顺便说一句, 如果你要打开的文 件不存在,它会为你创建一个, 所以不用担心文件创建的问题. 现在就输出到文件,看起来和"cout"的操 作很像。 对不了解控制台输出"cout"的人, 这里有个例子。 int num = 150; char name[] = "John Doe"; fout << "Here is a number: " << num << " "; fout << "Now here is a string: " << name << " ";   现在保存文件,你必须关闭文件,或者回写文件缓冲. 文件关闭之后就不能再操作了, 所以只有在你 不再操作这个文件的时候才调用它,它会自动保存文件。 回写缓冲区会在保持文件打开的情况下保存文 件, 所以只要有必要就使用它。回写看起来像另一次输出, 然后调用方法关闭。像这样: fout << flush; fout.close();    现在你用文本编辑器打开文件,内容看起来是这样:   Here is a number: 150 Now here is a string: John Doe   很简单吧! 现在继续文件输入, 需要一点技巧, 所以先确认你已经明白了流操作,对 "<<" 和">>" 比较熟悉了, 因为你接下来还要用到他们。继续…   二、ASCII 输入   输入和"cin" 流很像. 和刚刚讨论的输出流很像, 但你要考虑几件事情。在我们开始复杂的内容之前 , 先看一个文本:   12 GameDev 15.45 L This is really awesome!   为了打开这个文件,你必须创建一个in-stream对象,?像这样。 ifstream fin("input.txt");   现在读入前四行. 你还记得怎么用"<<" 操作符往流里插入变量和符号吧?好,?在 "<<" (插入)?操作 符之后,是">>" (提取) 操作符. 使用方法是一样的. 看这个代码片段.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值