一、输入输出流
- 三种流:
- istream、ostream、iostream 标准输入输出流
- ifstream、ofstream、ftream 文件输入输出流
- istringstream、ostringstream、stringstream 字符串输入输出流
-
三种流的关系:
-
流的状态iostate:
1.badbit :表示发生系统级的错误,如不可恢复的读写错误。通常情况下一旦 badbit 被置位,流就无法再使用了。
2.failbit :表示发生可恢复的错误,如期望读取一个数值,却读出一个字符等错误。这种问题通常是可以修改的,流还可以继续
使用。当到达文件的结束位置时,eofbit和failbit 都会被置位。
3.goodbit :表示流未发生错误。如果 badbit、failbit和eofbit任何一个被置位,则检查流状态的条件会失。
4.eofbit :表示输入流已经到达文件结束位置。
- 管理流的状态
//判断流的状态的几种函数。
//若流的badbit置位,则返回true;否则返回false
bool bad() const;
//若流的failbit或badbit置位,则返回true;
bool fail() const;
//若流的eofbit置位,则返回true;
bool eof() const;
//若流处于有效状态,则返回true;
bool good() const;
//获取流的状态
iostate rdstate() const;
//设置流的状态
void setstate(iostate state);
//clear的无参版本会复位所有错误标志位*(重置流的状态)
void clear(std::ios_base::iostate state = std::ios_base::goodbit);
- 流的通用操作
//----以下输入流操作----
//读取一个字符
int_type get();
istream & get(char_type & ch);
//读取一行数据
istream & getline(char_type * s, std::streamsize count, char_type delim ='\n');
//读取count个字节的数据
istream & read(char_type * s, std::streamsize count);
//最多获取count个字节,返回值为实际获取的字节数
std::streamsize readsome(char_type * s, std::streamsize count);
//读取到前count个字符或在读这count个字符进程中遇到delim字符就停止,并把读取的这些东西丢掉
istream & ignore(std::streamsize count = 1, int_type delim = Traits::eof());
//查看输入流中的下一个字符, 但是并不将该字符从输入流中取走,返回该字符
//不会跳过输入流中的空格、回车符; 在输入流已经结束的情况下,返回 EOF。
int_type peek();
//获取当前流中游标所在的位置
pos_type tellg();
// 可选的偏移位置
ios_base::beg 文件开头
ios_base::cur 当前指针位置
ios_base::end 文件结尾位置
//偏移游标的位置
basic_istream & seekg(pos_type pos);
basic_istream & seekg(off_type off, std::ios::seekdir dir);
//----以下为输出流操作----
//往输出流中写入一个字符
ostream & put(char_type ch);
//往输出流中写入count个字符
ostream & write(const char_type * s, std::streamsize count);
//获取当前流中游标所在的位置
pos_type tellp();
//刷新缓冲区
ostream & flush();
//偏移游标的位置
ostream & seekp(pos_type pos);
ostream & seekp(off_type off, std::ios_base::seekdir dir);
二、输入输出缓冲区
-
缓冲区
缓冲区是一块内存区,它用在输入输出设备和 CPU 之间,用来缓存数据。它使得低速的输入输出设备和高速的 CPU 能够协调工作,避免低速的输入输出设备占用 CPU ,解放出 CPU ,使其能够高效率工作。 -
三种缓冲区
- 全缓冲:在这种情况下,当填满标准 I/O 缓存后才进行实际 I/O 操作。全缓冲的典型代表是对磁盘文件的读写。
- 行缓冲:在这种情况下,当在输入和输出中遇到换行符时,执行真正的 I/O 操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的 I/O 操作。典型代表是键盘输入数据。
- 不带缓冲:也就是不进行缓冲,标准出错情况 cerr/stderr 是典型代表,这使得出错信息可以直接尽快地显示出来。
-
类别
输入缓冲区:cin。
输出缓冲区:cout、cerr(非缓冲)\clog(带缓冲)。 -
输出缓冲区刷新的几种情况:
- 程序正常结束(有一个收尾操作就是清空缓冲区);
- 缓冲区满(包含正常情况和异常情况);
- 使用操纵符显式地刷新输出缓冲区,如: endl(换行)、ends(末尾加上一个空字符)、flush(直接刷新缓冲区);
三、文件I\O
- 文件的打开模式(openmode)
in : 输入,文件将允许做读操作;如果文件不存在,打开失败
out : 输出,文件将允许做写操作;如果文件不存在,则直接创建一个
app : 追加,写入将始终发生在文件的末尾
ate : 末尾,写入最初在文件的末尾
trunc : 截断,如果打开的文件存在,其内容将被丢弃,其大小被截断为零
binary : 二进制,读取或写入文件的数据为二进制形式