C++ I/O

引言:

为了支持不同种类的I/O处理操作,标准库定义了一些别的I/O类型:  <iostream>  <fstream>  <sstream>

ofstream out1, out2;
out1=out2;                       //错误:不能对流对象进行赋值
ofstream print(ofstream);        //错误:不能初始化ofstream参数
out2=print(out2);                //错误:不能拷贝流对象
  • 因为不能拷贝流对象,所以一般需要传递流对象时,常采用引用方式返回和传递流,并且流类型不能是const的。

流的条件状态:

strm::iostate  
strm::badbit 用来指出流已经崩溃
strm::failbit 用来指出一个I\O操作失败
strm::eofbit

用来指出流到达了文件结束

strm::goodbit 指出流未处于错误状态
s.eof() 若流的eofbit置位,返回true
s.fail() 若流的failbit置位,返回true
s.bad() 若流的badbit置位,返回true
s.good() 若流状态有效,返回true
s.clear() 将流中所有条件状态位复位,状态设置为有效
s.clear(flags) 根据给定的flags,将流中所有条件状态位复位
s.setstate(flags) 根据给定的flags,将流中所有条件状态位置位
s.rdstate() 返回流的当前状态

一、基本I/O类型

头文件 <iostream>提供三个类型支持基本I/O:  istream  ostream iostream

没啥说的。。。

二、文件I/O

头文件 <fstream> 提供三个类型来支持文件I/O:ifstream  ofstream  fstream

fstream特有的操作:

fstream file; 创建一个未绑定的文件流
fstream file(s); 创建一个文件流,打开名为s的文件
fstream file(s, mode); 创建一个文件流,以mode模式打开名为s的文件
file.open(s); 指定文件流打开名为s的文件
file.close(); 指定文件流关闭文件
file.is_open(); 返回bool值,指出是否已打开一个文件

mode的类型有以下几种:

in 读方式打开
out 写方式打开
app 每次写操作前定位到文件末尾
ate 打开文件后定位到文件末尾
trunc 截断文件
binary 以二进制方式进行I/O
  • 只可以对ofstream或fstream指定out模式。
  • 只可以对ifstream或fstream指定in模式。
  • 只有当out被设定时才可设定trunc模式。
  • 只要trunc未被设定,就可以设定app模式。且app模式总是以out模式打开。
  • ate和binary适合任何类型的文件流对象。

 

三、string流

头文件 <sstream> 提供三个类型来支持文件I/O:istringstream   ostringstream  stringstream

sstream strm;

strm是一个未绑定的stringstream对象
sstream strm(s); strm是一个stringstream对象,保存string s的一个拷贝
strm.str() 返回strm保存的string拷贝
strm.str(s) 将string s拷贝到strm中

为了更好理解如何使用这些I/O库,一个问题:

        假定有一个文件,列出了一些人名和他们的电话号码。人名只会出现一次,但一个人可能会有多个电话号码。因此输入文件大概是这样的:

      xiaoming 1354345336 4568963254

      bill 1323232323

      tyrrty 4512554512 1597565232 1123556853

//需要类似这样的结构体保存人员信息
struct PersonInfo {
    string name;
    vector<string> phones;
}
//处理数据并将结果保存在一个vector中
vector<PersonInfo> people;
ifstream in("data.txt");
string line, num;
while (getline(in, line))
{
    PersonInfo info;
    istringstream record(line);
    record>>info.name;
    while (record>>num)
        info.phones.push_back(num);
    people.push_back(info);
}
in.close();

猜你喜欢

转载自blog.csdn.net/qq_39786762/article/details/81207478