1. C++ 程序通常在用户按下回车键时刷新输入缓冲区。
C++ I/O定义了一些类模板,以支持char 和 what_t 数据。使用typedef工具,C++使得这些模板char具体化到能模仿传统的非模板I/O实现。下面是相关类:
- streambuf 类为缓冲区提供了内存,并提供了用于填充缓冲区,访问缓冲区内容,刷新缓冲区和管理缓冲区内存的类方法;
- ios_base 类表示流的一般特征,如是否可读取,是二进制流还是文本流等;
- ostream,istream都是从ios类派生来的,提供了输出和输入方法;
- iostream类是基于istream和ostream类的,因此继承了输入和输出方法。
要使用这些工具,必须使用适当的类对象。例如cin cout。
2. 重载的<<操作符
<< 默认含义是按位左移操作符,但是ostream类重新定义了<<操作符,方法是将其重载为输出。
在这种情况下,<<叫做插入操作符,而不是左移操作符。插入操作符被重载,使之能够识别C++中多有基本类型。ostream都提供了operator<<() 函数的定义。
例如: ostream & perator<<(int) 表示函数接受一个int参数。
3. write()显示整个字符串,模板原型为:
basic_ostream<charT, traits>& write(const char_type* s, streamsize n);
cout.wirite() 调用cout对象,因为write方法返回一个指向调用它的对象的引用,这里调用它的对象是cout.
write方法并不会在遇到空字符时自动停止打印字符,而只是打印指定数目的字符,即使超过了字符串的边界!
writ()方法也可以用于数值数据,可以将地址强制转换为char*,然后传递给它。
long val = 4545121212;
cout.write((char*) &val, sizeof(long));
4. 刷新缓冲区
缓冲区被填满,程序将flush刷新缓冲区,把内容发出去,并清空缓冲区,以存储新的数据。
通常缓冲区为512字节或其整数倍。
但是,在屏幕输出时,不用等到缓冲区填满,例如将换行符发送到缓冲区,将刷新缓冲区;另外输入即将发生缓冲区刷新。
实际上,控制符也是函数。 例,可以直接调用flush()来刷新cout缓冲区; flush(cout);
5. c++ 将十六进制和八进制都视为无符号的。
6. 使用cin进行输入
cin对象将标准输入表示为字节流。输入流的方法,跳过空白(space, enter, tab),直到遇到非空白字符。即使对于单字符模式,>>操作符将读取一个指定类型的数据。也就是说,它读取从非空白字符开始,到与目标类型不匹配的第一个字符之间的全部内容。
7. 流状态
设置状态
clear() 在输入不匹配或到达文件尾时,需要使用不带参数的clear()重新打开输入。
setstate() 为了输入和输出函数提供一种修改状态的途径。例如:setstate(eofbit)
8. get(char&) 和 get(void) 提供不跳过空白的单字符输入功能。
cin.get(ch)指向istream对象的引用,到达文件末尾时函数返回值,转换为false
cin.get(void)字符编码 int, 到达文件末尾时函数的返回值是EOF
9. 字符串输入:getline() get() ignore()
get()将换行符留在输入流中,这样接下来的输入操作首先将看到换行符;
getline()抽取并丢弃输入流中的换行符。
10. 文件输入和输出
字处理程序创建文件;数据库程序创建和搜索信息文件;编译器读取源代码文件并生成可执行文件。文件本身是存储在某种设备上的一系列字节。
11. 随机存取
随机存取指的是直接移动(不是依次移动)到文件的任何位置。随机存取通常被用于数据库文件,程序维护一个独立的索引文件,该文件指出数据在主数据文件中的位置。
12. cin.get(char)成员函数调用通过返回转换为false的bool值来指出已达到EOF, 而cin.get()成员函数调用则通过返回EOF值来指出已达到EOF,EOF在文件iostream中定义的。