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
来定义。