输入输出流
istream 是用于输入的流类, ostream 是用于输出的流类. ifstream 继承 自 istream, 用于从文件中读取数据; ofstream 继承自 ostream, 用于向文件中写入数据. fstream 继承自 iostream, 既可以用于输入也可以用于输出.
- 输入流对象:
cin与标准输入设备相连, 对应于标准输入流, 用于从键盘读取数据, 也可以被重定向为从文件中读取数据.
- 输出流对象:
cout与标准输出设备相连, 对应于标准输出流, 用于向屏幕输出数据, 也可以被重定向为向文件写入数据.cerr与标准错误输出设备相连.clog与标准错误输出设备相连, 但是缓冲的, 用于输出调试信息.
持续读入直到结束:
|
|
背后的原理是 istream 有一个 operator bool() 来判断.
读取输入流:
|
|
从输入流中读取 bufSize - 1 个字符 (要给 '\0' 留一个) 到缓冲区buf, 或读到碰到 \n 或 delim 字符为止 (哪个先到算哪个).
默认分隔符是换行符 \n, 也可以指定其他分隔符. 会自动在 buf 中读入数据的结尾添加'\0', '\n' 或 delim 都不会被读入buf, 但会被从输入流中取走.
需要注意, 如果
buf不足以容纳读入的字符, 就导致读入出错, 其结果就是虽然本次读入已经完成, 但是之后的读入就都会失败了.
重定向:
|
|
流操纵算子
流操纵算子是一些函数, 需要 #include <iomanip>, 用于控制输入输出流的格式. 例如:
-
整数流基数:
dec(十进制),hex(十六进制),oct(八进制),setbase(设置基数); -
浮点数的精度:
setprecision(设置精度) (precision是成员函数);- 非定点模式下,
setprecision设置有效数字的位数; - 定点模式下 (
setiosflags(ios::fixed)),setprecision设置小数点后面的有效位数;
- 非定点模式下,
-
域宽:
setw(设置域宽) (width是成员函数); 不够宽会用空格填充, 且宽度设置是一次性的.1 2 3 4 5 6 7 8 9 10int main() { int w = 4; char string[10]; cin.width(5); while (cin >> string) { cout.width(w++); cout << string << endl; cin.width(5); } }输入:
11234567890输出:
1 2 31234 5678 90
用户也可以自定义流操纵算子, 例如:
|
|
原理是 iostream 类中有一个 operator<< 函数
|
|
可以接收一个函数指针作为参数, 且函数内部把 this 对象传入这个函数, 这个函数返回一个 ostream 对象的引用.
文件操作
|
|
给出打开方式: ios::out 输出到文件,删除原有内容; ios::app 输出到文件,保留原有内容,总是在尾部添加.
- 对于输入文件, 有一个读指针;
- 对于输出文件, 有一个写指针;
- 对于输入输出文件, 有一个读写指针;
标识文件操作的当前位置, 该指针在哪里, 读写操作就在哪里进行:
|
|