以下为本人大一时阅读《C++ Primer Plus》中关于输入输出流章节所做的笔记
流:
输入:字节从设备流向内存
输出:字节从内存流向设备
非格式化的I/O:通常针对单个字节传输,速度快,不方便
格式化的I/O:字节被组成有意义的单元,例如整数、浮点数等
传统流与标准流:
char:1个字节,表示ASCII
wchar_t:2个字节,表示Unicode
char16_t、char32_t:指定大小的字符类型
iostream库的头文件
iostream:cin、cout、cerr、clog
iomanip:setw、setprecision
fstream:文件处理服务
输入/输出流的类和对象:
I/O流模板层次部分:
<<被重载为实现流的输出,称为流插入运算符(stream insertion operator)
>>被重载用于实现流的输入,称为流提取运算符(stream extraction operator)
cin-->连接到标准输入,通常是键盘
cout-->连接到标准输出设备,通常是显示屏
cerr-->连接到标准错误设备,输出无缓冲,意味着输出立刻显示
clog-->连接到标准错误设备,输出有缓冲,直到缓冲区填满或是被清空才会出书,可以加强I/O性能
类模板:
basic_istream(istream)支持输入流操作
basic_ostream(ostream)支持输出流操作
basic_iostream(iostream)支持输入流和输出流操作
basic_ifstream(ifstream)用于文件输入
basic_ofstream(ofstream)用于文件输入
basic_fstream(fstream)用于文件输入和输出
输出流:
char*变量的输出:
如果想输出char*的值(也即是字符串第一个字符的内存地址),但是<<运算符已被重载用于打印将char*数据类型作为以空字符结尾的字符串(即打印出这个内存地址上的字符串),如要打印出地址,先将char*强制转化为void*类型。
const char* const word="again"; cout< |
使用put进行字符输出:
输出字符:
cout.put('A'); |
级联使用:
cout.put('A').put('\n'); |
用代表一个ASCII值的数字表达式作为参数调用put成员函数:
cout.put(65); //输出A |
注意:put函数每次只能输出一个字符
输入流:
在每个输入操作之后,流提取运算符给接受到所提取的信息的流对象返回一个引用。
如果引用被用作判断条件,那么将隐式调用流重载的void*强制转换运算符函数,根据最后输入操作的成功与否将引用转化为非空指针或空指针。非空指针转化为true,表示输入成功。空指针转化为false,表示操作失败。
get和getline成员函数:
EOF是一个int类型的值。
打印cin.eof()的值,如果是0,表示cin流还没有读到文件尾;如果是1,表示cin已经读到文件尾。
cin和cin.get:
cin.get(buffer, 10); |
cin输入读取字符直到遇到空白字符。
cin.get默认分隔符是'\n'。
cin.get()函数有三个参数:一个字符数组,一个数组长度限制(读取字符个数最多为数组长度限制-1,因为在字符数组最后要插入一个空字符),一个分隔符。当读取到分隔符时候读取终止,这时候分隔符没有放置到字符数组中,而是保留在输入流中(分隔符是下一个被读取的字符),因此第二次调用get函数将读取一个分隔符,除非将分隔符从输入流中移出(可以使用cin.ignore())。
cin.get()函数返回输入的字符。当读取到输入文件结束符(windows操作系统是Ctrl+Z)返回EOF。
成员函数getline:
getline函数和get函数很类似,功能也基本一致
cin.getline(buffer, 10); |
ignore函数:
istream的成员函数ignore可以读取并丢弃一定数量的字符(默认为1个字符)或者遇到指定分隔符时停止(默认为EOF)
putback函数:
将先前使用get函数从输入流中获得的字符再放回到流中。
peek函数:
返回输入流中的下一个字符,但并不将它从流里去除。
成员函数read和write:
分别是非格式化的输入和输出函数。
read函数将一定数量的字节读入到字符数组中,write函数则从字符数组中输出字节。这些字节没有经过任何格式化,它们就像原始字节一样输入和输出。
cin.read(buffer, 10); |
将会读取10个字符到字符数组buffer中。
cout.write("ABCDEFGHIJKL", 10); |
将会输出前10个字母。
成员函数gcount返回最近一次输入操作所读取的字符数。
cout.write(buffer, cin.gcount()); |
流操纵符(stream manipulator):
整形流的基数:dec、oct、hex、setbase:
使用setbase必须包含
cin>>number; cout< cout< cout< cout< |
上述最后四行分别表示:用八进制、十进制、十六进制、十进制输出number。
注意:
1.操纵符具有黏性。
例:
cout< |
或
cout< |
当使用上述代码后,后面使用cout输出任何数都用十六进制输出,直到显式地重新设置基数
2.setbase函数的参数不是8或16时,后述的cout输出都使用十进制输出,例如cout< 浮点精度(precision、setprecision): 调用setprecision或ios_base的成员函数precision来控制浮点数的精度 cout< cout.precision(2); //后面的输出都将输出小数点后2位 cout< 域宽(width, setw) width函数:如果输出值的宽度比域宽小,则插入填充字符进行填充(在左侧填充)。大于域宽的将全部打印出来。不含参数的width函数将返回当前域宽。注意width函数和setw函数的宽度设置只适用于下一次输入或输出,是非黏性的 int a=1; cout.width(3); cout< cout< 自定义输出流操纵符 注意对于输出流操纵符来说,它们的返回类型和参数都必须是ostream&类型,下面写一个跟endl类似的endline输出流操纵符 ostream& endline(ostream& output) { return output<<"\n"< } int main() { cout<<"000"< return 0; } showpoint: 强制要求浮点数输出带小数点和尾数零(浮点数默认精度是6,故默认输出补充零到小数点后五位,除非重新设置了精度)(黏性设置) cout< 对齐(left, right, internal): 流操纵符left使域左对齐并在其右边填充字符,right相反。填充字符由成员函数fill或是参数化刘操纵符setfill指定(默认是空字符)。对齐与setfill、fill都是黏性的 cout.fill('*'); cout< cout< cout< 流操纵符internal表示数字的符号应当左对齐,数字的数值部分应当右对齐,中间部分则使用填充字符填充。使用showpos表示强制要求正数需要输出加号,通是可以使用noshowpos取消showpos设置(showpos是黏性设置) cout< cout< scientic,fixed: 都是黏性操作符。fixed要求浮点数以指定小数位数形式显示。scientific要求用科学计数法输出浮点数。 double x=0.00123456; double y=1.946e9; cout< cout< cout< 输出: 0.00123456 1.946e+009 1.234560e-003 1.946000e+009 0.001235 1946000000.000000 showbase: 使用showbase要求数字输出前面带上基数,即十进制整数不变,八进制带上0,十六进制带上0x(黏性设置,使用noshowbase取消设置) int x=100; cout< cout< 输出: 0x64 uppercase: 默认情况下十六进制值中的字符和科学计数法中的浮点数的字母e都是用小写字母表示,用uppercase后将用大写字母表示,黏性设置,同时可以用nouppercase取消设置。 int x=4564651235645465; cout< cout< boolalpha: 使用boolalpha设置输出流以字符串true和flase来显式bool值,取代1和0的输出形式。黏性设置,可以使用noboolalpha来取代。(使用uppercase后不会导致字符串换为大写字母) bool b=1; cout< 流的错误状态: cin.eof() 判断流是否遇到了文件尾,是返回1,否则返回0 遇到文件尾,eofbit会被设置 读取到不符合要求的类型时(例如要读取整数却读到了不是非数字字符时),failbit会被设置 发生数据丢失错误时,badbit会被设置 当eofbit、failbit、badbit都是false,goodbit会被设置为true IO操作只能在“好的”流中进行 cin.clear() clear函数将流的状态重置为“好的”,使流可以继续进行IO操作。clear函数的默认参数是goodbit cin.clear(); 清空了cin,并且将该流设置goodbit位 cin.clear(ios::failbit); 为流设置failbit位。