Table of Contents:

什么是流 

cout格式化输出

C++ 通常使用 cout 输出数据,和 printf() 函数相比,cout 实现格式化输出数据的方式更加多样化。
一方面,cout 作为 ostream 类的对象,该类中提供有一些成员方法,可实现对输出数据的格式化;
另一方面,为了方面用户格式化输出数据,C++ 标准库专门提供了一个 <iomanip> 头文件,该头文件中包含有大量的格式控制符(严格意义上称为“流操纵算子”),使用更加方便。

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

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; //回到正常的缓冲方式