Table of Contents:

 什么是流 

 istream 是用于输入的流类,cin 就是该类的对象。
 ostream 是用于输出的流类,cout 就是该类的对象。
 iostream 是既能用于输入,又能用于输出的类。
 ifstream 是用于从文件读取数据的类。
 ofstream 是用于向文件写入数据的类。
 fstream 是既能从文件读取数据,又能向文件写入数据的类。
 cerr 对应于标准错误输出流,用于向屏幕输出出错信息,不能被重定向,cerr 不使用缓冲区
 clog 对应于标准错误输出流,用于向屏幕输出出错信息,不能被重定向。

 C++ cout格式化输出(输出格式)

1. 使用流操作算子
2. setiosflags() 算子
3. 调用cout的成员函数

 C++ cout.put():输出单个字符

cout.put(ch1).put(ch2).put(ch3); 或者 putchar()

 cin判断输入结束(读取结束)

在控制台中输入特殊的控制字符就表示输入结束了:
 在 Windows 系统中,通过键盘输入时,按 Ctrl+Z 组合键后再按回车键,就代表输入结束。
 在 UNIX/Linux/Mac OS 系统中,Ctrl+D 代表输入结束。

cin 判断文件读取结束
如果将标准输入重定向为某个文件,如在程序开始添加freopen("test.txt", "r", stdin);语句,或者不添加上述语句,但是在 Windows 的“命令提示符”窗口中输入:

mycin < test.txt //假设编译生成的可执行文件的名字为 mycin.exe

cin 读到文件末尾时,cin >> n就会返回 false,从而导致程序结束。

 cin.get():C++读取单个字符

get() 函数不会跳过空格、制表符、回车等特殊字符,所有的字符都能被读入。

#include <iostream>
using namespace std;
int main()
{
    int c;
    while ((c = cin.get()) != EOF)
        cout.put(c);
    return 0;
}

 cin.getline():C++读入一行字符串(整行数据)

getline() 是 istream 类的成员函数,它有如下两个重载版本:

istream & getline(char* buf, int bufSize);
istream & getline(char* buf, int bufSize, char delim);

 cin.ignore():C++跳过(忽略)指定字符

istream & ignore(int n =1, int delim = EOF);

此函数的作用是跳过输入流中的 n 个字符,或跳过 delim 及其之前的所有字符,哪个条件先满足就按哪个执行

 cin.peek():C++查看输入流中的下一个字符

在输入数据的格式不同,需要预先判断格式再决定如何输入时,peek() 就能起到作用。
istream 还有一个成员函数 istream & putback(char c),可以将一个字符插入输入流的最前面。

 C++管理输出缓冲区

cout << "hi!" << endl; //输出hi和一个换行,然后刷新缓冲区
cout << "hi!" << flush; //输出hi,然后刷新缓冲区,不附加任何额外字符
cout << "hi!" << ends; //输出hi和一个空字符,然后刷新缓冲区

unitbuf 操作符

如果想在每次输出操作后都刷新缓冲区,我们可以使用 unitbuf 操作符,它告诉流在接下来的每次写操作之后都进行一次 flush 操作。
而 nounitbuf 操作符则重置流, 使其恢复使用正常的系统管理的缓冲区刷新机制

cout << unitbuf; //所有输出操作后都会立即刷新缓冲区
//任何输出都立即刷新,无缓冲
cout << nounitbuf; //回到正常的缓冲方式