C++ 笔记 | 第8课 流类库的输入与输出¶
I/O 流 负责在两个对象之间建立联系, 并管理数据的流动.
读操作在流数据抽象中被称为 从流中提取.
写操作在流数据抽象中被称为 向流中插入.
输出流¶
ostream 通用输出流类 (标准输出)¶
cout标准输出cerr标准错误输出, 无缓冲, 立即输出clog标准错误输出, 有缓冲, 缓冲区满时再输出<<插入运算符
ofstream 输出文件流类 (向文件输出)¶
打开文件的四种方式¶
| C++ | |
|---|---|
iosmode¶
of.open("filename") 默认以文本写的方式打开文件
ios_base::app文件尾添加ios_base::ate打开现存文件并移到文件尾ios_base::in打开一个输入文件ios_base::out写方式打开, 隐含模式, 可以省略ios_base::trunc打开文件, 抹去原有内容ios_base::binary二进制方式打开 (默认文本方式打开)ios_base::nocreate打开已有文件,否则失败ios_base::noreplace文件不存在则生成,否则失败
以上各方式可以通过 | 运算符组合起来使用
常用输出流成员函数¶
open()¶
ios_base:: 是 ISO C++ 方式
close()¶
如 of.close(); ofp->close();
文件使用完毕必须关闭; 不过 ofstream 类的析构函数也能自动完成文件关闭
put()¶
write()¶
二进制方式写到文件输出流中。
如 of.write((char *)&dt, sizeof dt);
一定要把输出对象的指针转成 char * 型 按字节输出
seekp()和 tellp()¶
tellp() 返回当前文件指针位置
seekp(n, pos) 设置指针位置
pos 取值¶
ios_base::beg从文件头开始 (默认)ios_base::end从文件尾开始ios_base::cur从文件指针的当前位置开始
flush()¶
清空 I/O 缓冲区 到文件中, 防止出现同时写 / 读同一文件时,内容不同步。
clear()¶
clear() 清除 (复位) 所有错误标记位,包括:goodbit, failbit, eofbit, badbit, 在发生输入输出错误后,需要利用 clear() 让输入输出流对象恢复正常。
同一个流对象在打开过一个文件并关闭后, 再打开另一个文件前,最好先调用一次 clear 函数, 给流对象复位。
错误处理函数¶
eof()遇到文件尾则返回一个非 0 值bad()fail()good()
文本输出格式的控制符¶
setw 操纵符¶
width()setw()设置随后的输出项宽度cout.width()设置随后的输出项宽度cout.fill()用 () 中的符号填充空白
对齐方式¶
(需要 #include<iomanip>)
setiosflags(ios_base::right)(默认) 右对齐setiosflags(ios_base::left)左对齐
精度¶
setprecision(i) 设置随后输出的浮点数 i 位小数 setiosflags(ios_base::fixed) 小数方式 setiosflags(ios_base::scientific) 科学方式
始终按 6 位有效数字输出浮点数,直至按科学方式输出浮点数
进制¶
进制 dec、oct、hex 分别以十进制、八进制、十六进制方式输出,默认为十进制
setiosflags(ios_base::uppercase)
将字母按大写方式输出十六进制数
setiosflags¶
setiosflags 不同于 width 和 setw,它的影响是持久的. 用 resetiosflags 操作符关闭前面 setiosflags 设置的标志, 重新恢复默认值时 setiosflags 设置的标志影响力才终止。此时下一个 setiosflags 设置才会起作用。
ostringstream 输出字符串流类 (向字符串输出)¶
输入流¶
istream 通用输入流类 (标准输入)¶
cin
提取操作符 >>
可以用 dec oct hex 改变输入流的输入方式
get getline 的功能是从输入流一次读入多个字符, 并包括控制符, 可以从标准设备 / 文件输入.
ifstream 输入文件流类 (从文件输入)¶
打开文件的四种方式¶
| C++ | |
|---|---|
iosmode¶
ios_base::in(默认方式)ios_base::binary二进制方式 (默认文本方式)
输入流常用函数¶
read()¶
实现二进制读
seekg()和 tellg()¶
seekg()返回当前文件指针位置seekg(n, pos)设置指针位置
pos 取值¶
ios_base::beg从文件头开始 (默认)ios_base::end从文件尾开始ios_base::cur从文件指针的当前位置开始
ignore()¶
ignore(n, 终止字符) 跳过输入流的 n 个字符, 或直到指定的终止字符 (终止字符也跳过),终止字符 可以是任意字符,但通常是回车符 \n
sync()¶
sync() 清空输入输出缓冲区,把输入丢掉,把输出打印出来 (或送到文件中)。
清空输入缓冲区¶
| C++ | |
|---|---|
| C++ | |
|---|---|
fail()¶
fail() 可由 cin.fail() 判断上一次的输入是否成功
good() bad() eof()
peek()¶
预览将要读入的下一个字符,但不改变输入流。
putback()¶
将一个字符放回到输入流中。但放回去的字符数不能超过读入的字符数。
unget()¶
将最近读入的一个字符放回到输入流中。
istringstream 输入字符串流类 (从字符串输入)¶
输入输出流¶
fstream 为输入输出流,它有两个子类:
- ifstream(input file stream)
- ofstream(output file stream)
其中 ifstream 默认以输入方式打开文件, ofstream 默认以输出方式打开文件。
所以,在实际应用中,根据需要的不同,选择不同的类来定义
如果想以输入 / 输出方式来打开,就用 fstream 来定义。