C++ Primer第五版之第8章 IO类

  • getline函数
    • 从一个给定的istream读取一行数据,存入一个给定的string对象中。
string str;
std::getline(cin, str);

1. IO类

  • IO类型:定义在三个独立的头文件中(iostream、fstream、sstream)
头文件       类型
iostream    istream         从流读取数据
            ostream         向流写入数据
            iostream        读写流
fstream     ifstream        从文件读取数据
            ofstream        向文件写入数据
            fstream         读写文件
sstream     istringstream   从string读取数据
            ostringstream   向string写入数据
            stringstream    读写string
//在类型或者函数前添加w代表宽字符版本

IO对象无拷贝和赋值

while(cin>>word)
	//操作
  • 由于不能拷贝IO对象,因此我们也不能将形参或返回类型设置为IO类型。
  • 进行io操作的函数通常以引用方式传递和返回流,而读写io对象会改变其状态,因此传递和返回的引用不能是const的

条件状态

  • 确定一个IO对象的状态最简单的方法是将它当作一个条件来使用:
while(cin>>word)
	//操作

2. 文件输入输出

  • ftream继承自iostream,其特有的操作如下:
fstream fstrm;            //创建一个未绑定的文件流
fstream fstrm(s);         //创建一个fstrem,并打开名为s的文件
fstream fstrm(s, mode);   //与上一个函数类似,但按指定mode打开文件
fstrm.open(s)             //打开名为s的文件,并将文件与fstrm绑定
fstrm.close()             //关闭与fstrm绑定的文件
fstrm.is_open()           //返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
  • 使用文件流对象:
ifstream in(file);     //构造一个ifstream并打开指定文件  
ofstream out;          //输出文件流未关联到任何文件
char* fname = "123.txt";
ifstream f(fname);
string str;
getline(f, str);
cout << str << endl;
  • 对于一个接受ostream&参数的函数,可以传递给它一个ofstream对象,istream同理。
  • 成员函数open和close
    • 如果我们定义了一个空文件流对象,可以随后调用open将其和文件关联
    • 调用open可能会失败,因此通常对其调用是否成功进行检测。
ofstream out;
out.open(fname+".copy");
if(out)
	out << "Hello World!\n";
out.close();
  • 一旦一个文件流打开,它就保持与对应文件的关联。为了将文件流关联到另一个文件,必须首先关闭已经关联的文件。
ifstream in(ifile1);
in.close();
in.open(ifile2);
  • 当一个fstream对象离开其作用域时会被自动销毁,与之关联的文件会自动关闭。

文件模式

in            //以读方式打开,ifstream默认使用此模式
out           //以写方式打开,ofstream默认使用此模式,fstream默认使用in和out模式。,以out模式打 
                开的文件默认会被截断
app           //每次写操作前均定位到文件末尾
ate           //打开文件后立即定位到文件末尾
trunc         //截断文件
binary        //以二进制方式进行IO
  • ofstream和fstream只能用out模式,istream和fstream只能用in模式。
  • ate和binary可以用于任何类型的文件流对象,且可以与其他模式组合使用。
  • 以out模式打开文件会丢弃已有数据,为了保存文件内容,显示指定app模式
    ofstream out("file",ofstream::app);    //定位到文件末尾,保存文件中的已有数据 
ofstream app("file2", ofstream::app);
//或者
ofstream app("file2", ofstream::out | ofstream::app);
  • 每次调用open时都会确定文件模式

 

ofstream out;
out.open("123"); //模式隐含设置为输出和截断
out.close();
out.open("abc", ofstream::app); //模式为输出和追加

3. string流

  • 头文件:#include<sstream>
    • istringstream:从string中读取数据;
      ostringstream:向string中写数据
      stringstream:读写数据
  • stringstream特有的操作:
sstream strm;        //strm是一个未绑定的stringstream对象 
sstream strm(s);     //strm是一个sstream对象,保存string s的一个拷贝
strm.str()           //返回strm所保存的string的拷贝
strm.str(s)          //将string s拷贝到strm中,返回void

使用istringstream

//string流
struct PersonInfo
{
	string name;
	vector<string>phones;
};

string line, word;
vector<PersonInfo> people;
string inf = "person_info.txt";
ifstream in(inf);
while (getline(in, line)) //获取每一行
{
	PersonInfo person;
	istringstream record(line); //将记录绑定到读入的行
	record >> person.name;
	while (record >> word)
		person.phones.push_back(word);
	people.push_back(person);
}

使用ostringstream

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值