我的C++primer长征之路:IO库

很久不学C++,不少东西都变得很模糊,之前上课老师讲的内容其实很少,很多特性没有介绍,知识体系不够完整。所以打算系统地自学,我知道这将是很漫长的一段自学之路,我也不确定能否坚持完成,暂且就先且行且记录吧。我用的是目前最新的第五版,基于C++11标准的,介绍很多现代C++的新特性。

由于之前学习过,而且个人比较喜欢按模块来学习,所以并不是按照书本的顺序来讲,而是穿插着来学。由于还要帮老师搬砖,时间有限,不定期更,先记录着,之后可能的话再按顺序整理成一个合集吧。。

IO库

IO类

IO库类型和头文件
头文件类型
iostreamistream,wistream从流读取数据
ostream,wostream向流写入数据
iostream,wiostream读写流
fstreamifstream,wifstream从文件读取数据
ofstream,wofstream向文件写入数据
fstream,wfstream 读写文件
sstreamistringstream,wistringstream从string读取数据
ostringstream,wostringstream向string写入数据
stringstream,wstringstream读写string

其中前缀为w的为宽字符版本。ifstream和istringstream都继承自istream,也就是说可以像使用istream对象一样来使用ifstream和istringstream对象。

IO对象无拷贝或赋值
不能拷贝或者对IO对象赋值。

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

由于不能拷贝流对象,所以函数形参或者返回值不能为流类型,通常以引用方式传递和返回一个流,而且不能是const引用。比如重载<<操作符时,其参数和返回值是流引用。

刷新输出缓冲区

cout << "hi" << endl; //输出hi和一个换行,然后刷新输出缓冲区
cout << "hi" << flush; //输出hi,然后刷新缓冲区,但不输出任何额外字符
cout << "hi" << ends; //输出hi和一个空字符,然后刷新缓冲区

unitbuf操纵符,使用该操纵符后,所有的每次操作都会执行flush操作。

cout << unitbuf; //所有输出操作后都会立刻刷新缓冲区
//期间任何输出操作都会立刻刷新
cout << nounitbuf; //恢复到正常刷新模式

关联输入和输出流
当一个输入流被关联到输出流时,任何从输入流读取数据的操作都会先刷新关联的输出流,标准库将cout和cin关联在一起,也就是说

cin >> ival;

会导致cout缓冲立刻被刷新。
tie()有两个版本,一个不带参数,返回指向输出流的指针,如果对象当前未关联到输出流则返回空指针。第二个版本接收一个指向ostream的指针,将自己关联到该输出流。即,x.tie(&o)将流x关联到输出流o。

文件输入输出

关于文件输入出,可以用<<和>>读写文件,也可以用getline从一个ifstream读取数据。
fstream特有操作

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

文件模式

in以读方式打开
out以写方式打开
app每次写操作均定位到文件尾
ate打开文件后立即定位到文件尾
trunc截断文件
binary以2进制方式进行IO
  • 只可以对ofstream和fstream对象设置out模式。
  • 同理,只可以对ifstream和fstream对象设置in模式。
  • 只有当out被设定时才能设定trunc模式。
  • 只要trunc模式未被设定,就可以设定app模式,在app模式下,即使没有显式指定out模式,文件也总是以输出方式被打开。
  • 默认情况下,即使没有指定trunc,以out模式打开的文件也会被截断,如果要保留以out模式打开的文件内容,必须同时指定app模式或者in模式。
  • ate和binary可以用于任何类型文件流对象。
  • ifstream关联的文件默认以in模式打开。ofstream关联的文件默认以out模式打开,会丢失文件内容,唯一方式保存文件内容是同时指定app模式或in模式保存内容。fstream关联的文件默认以out 和in 模式打开。
ofstream out("file1"); //隐含以输出格式打开并截断文件
ofstream out1("file1", ofstream::out);//隐含截断文件
ofstream out3("file1", ofstream::out | ofstream::trunc);
//显式指定app模式
ofstream app("file2", ofstream::app)//显示保存文件内容

string流

stringstream特有操作

sstreeam strmstrm是一个未绑定的stringstream对象。sstream是头文件sstream中定义的某一类型
sstream strm(s)strm是一个保存string s的一个sstream对象
strm.str()返回strm流中保存的string的拷贝
strm.str()将string s拷贝到strm中,返回void

使用istringstream
首先定义一个结构体

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

程序读取数据文件,创建一个PersonInfo的vector。vector中每个元素对应文件中的一条记录。

string line, word; //分别保存来自输入的一行和电话号码
vector<PersonInfo>people;
//逐行从输入读取数据,直到cin遇到文件尾或其他错误
while(getline(cin, line)){
	PersonInfo info;
	istringstream record(line); //将记录绑定到刚读入的行
	record >> info.name;
	while(record >> word){
		info.phones.push_back(word);
	}
	people.push_back(info);
	
}

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值