很久不学C++,不少东西都变得很模糊,之前上课老师讲的内容其实很少,很多特性没有介绍,知识体系不够完整。所以打算系统地自学,我知道这将是很漫长的一段自学之路,我也不确定能否坚持完成,暂且就先且行且记录吧。我用的是目前最新的第五版,基于C++11标准的,介绍很多现代C++的新特性。
由于之前学习过,而且个人比较喜欢按模块来学习,所以并不是按照书本的顺序来讲,而是穿插着来学。由于还要帮老师搬砖,时间有限,不定期更,先记录着,之后可能的话再按顺序整理成一个合集吧。。
IO库
IO类
IO库类型和头文件 |
---|
头文件 | 类型 |
---|---|
iostream | istream,wistream从流读取数据 ostream,wostream向流写入数据 iostream,wiostream读写流 |
fstream | ifstream,wifstream从文件读取数据 ofstream,wofstream向文件写入数据 fstream,wfstream 读写文件 |
sstream | istringstream,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 strm | strm是一个未绑定的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);
}
未完待续。。。