C++输入输出流

一、输入输出流

  • 三种流:
  1. istream、ostream、iostream 标准输入输出流
  2. ifstream、ofstream、ftream 文件输入输出流
  3. 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 ,使其能够高效率工作。

  • 三种缓冲区

  1. 全缓冲:在这种情况下,当填满标准 I/O 缓存后才进行实际 I/O 操作。全缓冲的典型代表是对磁盘文件的读写。
  2. 行缓冲:在这种情况下,当在输入和输出中遇到换行符时,执行真正的 I/O 操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的 I/O 操作。典型代表是键盘输入数据。
  3. 不带缓冲:也就是不进行缓冲,标准出错情况 cerr/stderr 是典型代表,这使得出错信息可以直接尽快地显示出来。
  • 类别
    输入缓冲区:cin。
    输出缓冲区:cout、cerr(非缓冲)\clog(带缓冲)。

  • 输出缓冲区刷新的几种情况:

  1. 程序正常结束(有一个收尾操作就是清空缓冲区);
  2. 缓冲区满(包含正常情况和异常情况);
  3. 使用操纵符显式地刷新输出缓冲区,如: endl(换行)、ends(末尾加上一个空字符)、flush(直接刷新缓冲区);

三、文件I\O

  • 文件的打开模式(openmode)
    in : 输入,文件将允许做读操作;如果文件不存在,打开失败
    out : 输出,文件将允许做写操作;如果文件不存在,则直接创建一个
    app : 追加,写入将始终发生在文件的末尾
    ate : 末尾,写入最初在文件的末尾
    trunc : 截断,如果打开的文件存在,其内容将被丢弃,其大小被截断为零
    binary : 二进制,读取或写入文件的数据为二进制形式
posted @ 2023-06-20 21:03  从今天学到明天  阅读(188)  评论(0)    收藏  举报