好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
istream 是用于输入的流类,cin 就是该类的对象。
ostream 是用于输出的流类,cout 就是该类的对象。
iostream 是既能用于输入,又能用于输出的类。
ifstream 是用于从文件读取数据的类。
ofstream 是用于向文件写入数据的类。
fstream 是既能从文件读取数据,又能向文件写入数据的类。
cerr 对应于标准错误输出流,用于向屏幕输出出错信息,不能被重定向,cerr 不使用缓冲区
clog 对应于标准错误输出流,用于向屏幕输出出错信息,不能被重定向。
1. 使用流操作算子
2. setiosflags() 算子
3. 调用cout的成员函数
cout.put(ch1).put(ch2).put(ch3); 或者 putchar()
在控制台中输入特殊的控制字符就表示输入结束了:
在 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,从而导致程序结束。
get() 函数不会跳过空格、制表符、回车等特殊字符,所有的字符都能被读入。
#include <iostream>
using namespace std;
int main()
{
int c;
while ((c = cin.get()) != EOF)
cout.put(c);
return 0;
}
getline() 是 istream 类的成员函数,它有如下两个重载版本:
istream & getline(char* buf, int bufSize);
istream & getline(char* buf, int bufSize, char delim);
istream & ignore(int n =1, int delim = EOF);
此函数的作用是跳过输入流中的 n 个字符,或跳过 delim 及其之前的所有字符,哪个条件先满足就按哪个执行
在输入数据的格式不同,需要预先判断格式再决定如何输入时,peek() 就能起到作用。
istream 还有一个成员函数 istream & putback(char c)
,可以将一个字符插入输入流的最前面。
cout << "hi!" << endl; //输出hi和一个换行,然后刷新缓冲区
cout << "hi!" << flush; //输出hi,然后刷新缓冲区,不附加任何额外字符
cout << "hi!" << ends; //输出hi和一个空字符,然后刷新缓冲区
unitbuf 操作符
如果想在每次输出操作后都刷新缓冲区,我们可以使用 unitbuf 操作符,它告诉流在接下来的每次写操作之后都进行一次 flush 操作。
而 nounitbuf 操作符则重置流, 使其恢复使用正常的系统管理的缓冲区刷新机制
cout << unitbuf; //所有输出操作后都会立即刷新缓冲区
//任何输出都立即刷新,无缓冲
cout << nounitbuf; //回到正常的缓冲方式