跳转至

C++ 笔记 | 第8课 流类库的输入与输出

I/O 流 负责在两个对象之间建立联系, 并管理数据的流动.

读操作在流数据抽象中被称为 从流中提取.

写操作在流数据抽象中被称为 向流中插入.

输出流

ostream 通用输出流类 (标准输出)

  • cout 标准输出
  • cerr 标准错误输出, 无缓冲, 立即输出
  • clog 标准错误输出, 有缓冲, 缓冲区满时再输出
  • << 插入运算符

ofstream 输出文件流类 (向文件输出)

打开文件的四种方式

C++
1
2
3
4
5
6
7
8
9
ofstream of("filename", iosmode);
/////
ofstream of;
of.open("filename", iosmode);
/////
ofstream *ofp = new ofstream("filename", iosmode);
/////
ofstream *ofp=new ofstream ;
ofp->open("filename", iosmode);
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()
C++
1
2
cout.put('A'); // cout << 'A';
of.put('A'); // of << 'A';
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 位有效数字输出浮点数,直至按科学方式输出浮点数

进制

进制 decocthex 分别以十进制、八进制、十六进制方式输出,默认为十进制

setiosflags(ios_base::uppercase)

将字母按大写方式输出十六进制数

setiosflags

setiosflags 不同于 widthsetw,它的影响是持久的. 用 resetiosflags 操作符关闭前面 setiosflags 设置的标志, 重新恢复默认值时 setiosflags 设置的标志影响力才终止。此时下一个 setiosflags 设置才会起作用。

ostringstream 输出字符串流类 (向字符串输出)

输入流

istream 通用输入流类 (标准输入)

cin

提取操作符 >>

可以用 dec oct hex 改变输入流的输入方式

get getline 的功能是从输入流一次读入多个字符, 并包括控制符, 可以从标准设备 / 文件输入.

ifstream 输入文件流类 (从文件输入)

打开文件的四种方式

C++
1
2
3
4
5
6
7
8
9
ifstream inf("filename", iosmode);
/////
ifstream inf;
inf.open("filename", iosmode);
/////
ifstream *infp=new ifstream("filename", iosmode);
/////
ifstream *infp=new ifstream ;
infp->open("filename", iosmode);
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++
1
2
3
4
5
#include<iostream>
#include<limits>
using namespace std;
cin.clear( ); // 清除 std::cin 的错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n');// 跳过能跳过的最大数 ( 也就是全部跳过)
C++
1
2
3
4
#include<iostream>
using namespace std;
cin.clear(); // 清除 std::cin 的错误状态
cin.sync( ); // 清空输入缓冲区
fail()

fail() 可由 cin.fail() 判断上一次的输入是否成功

good() bad() eof()

peek()

预览将要读入的下一个字符,但不改变输入流。

putback()

将一个字符放回到输入流中。但放回去的字符数不能超过读入的字符数。

unget()

将最近读入的一个字符放回到输入流中。

istringstream 输入字符串流类 (从字符串输入)

输入输出流

fstream 为输入输出流,它有两个子类: - ifstream(input file stream) - ofstream(output file stream)

其中 ifstream 默认以输入方式打开文件, ofstream 默认以输出方式打开文件。

所以,在实际应用中,根据需要的不同,选择不同的类来定义

如果想以输入 / 输出方式来打开,就用 fstream 来定义。