热门问题
时间线
聊天
视角
iostream
C++提供输入/输出的標準函示庫 来自维基百科,自由的百科全书
Remove ads
iostream是C++中用于数据的流式输入与输出的头文件,属于C++标准程序库的一部分。[1][2]
iostream 为 Input/Output Stream 的缩写,即是输入/输出流。“流”是一连串从I/O设备读写的字符。[3]
概述
流输入输出库中的大部分类都是模板类,可以适用于不同的字符类型或操作函数(如字符比较)。常用的一些字符类型的流输入输出已经用typedef定义了相应的模板特化实例。
例如,basic_fstream<CharT,Traits>
是文件流输入输出的实现的模板类。它的一个特化实例:fstream
是basic_fstream<char,char_traits<char>>
的类型别名,换句话说,这是basic_fstream
的字符类型为char
使用默认字符操作集的特化实例。
流输入输出库中的类可分为两类。一是定义了界面的抽象,适用于任何流类型,无论是文件流、内存缓存区流或者网络socket流。二是对具体数据源与数据汇(sink)的流的实现。C++标准库仅实现了文件流与内存缓冲区流。
流输入输出库中的类依据是否实现底层或高层操作可分为两类。实现了底层操作的类称作流缓冲区(stream buffer),处理没有任何格式化功能的字符。这些类极少被编程者直接使用。实现高层操作的类称作流,并提供了不同的格式化能力,是构建于流缓冲区之上的。
下表列出了流输入输出库的所有类的分类:
Remove ads
<ios>
包含着ios_base
与basic_ios
的类的定义,负责信息格式化与关联的流缓冲区。<istream>
包含了basic_istream
类模板定义,实现了格式化输入<ostream>
包含了basic_ostream
类模板定义,实现了格式化输出<iostream>
包含了basic_iostream
类模板定义,实现格式化输入输出<fstream>
包含了basic_ifstream
,basic_ofstream
与basic_fstream
类模板定义,实现格式化文件流的格式化输入、输出<sstream>
包含了basic_istringstream
,basic_ostringstream
与basic_stringstream
类模板定义,实现格式化字符串流的输入输出<iomanip>
包含了格式化manipulator<iosfwd>
包含了所有的流输入输出库的前向声明(forward declaration)
Remove ads
支持类
ios_base
与basic_ios
是两个类处理底层比特流。ios_base
存储格式化信息与流的状态。basic_ios
管理关联的流缓冲区。basic_ios
通常以特化实例ios
与wios
出现。basic_ios
与ios_base
很少被程序员直接使用。通常,它们的功能通过其它派生的类,如iostream
。[4][5]
Remove ads
输入/输出流
iostream
头文件定义了输入输出流对象:cin
, cout
, cerr
, clog
分别为标准输入、输出、错误(无缓冲)、簿记(有缓冲)的流对象。都属于std
命名空间。[6]
cout
属于ostream
类型,重载了左移位算符。cout左移位算符的运算结果为cout自身,这使得连续的左位移操作输出一串数据成为可能。cerr
与clog
对象是ostream
类型。
cin
是istream
类型,重载了右位移算符。
输入设备是按照行来把数据移入流输入缓冲区。也就是说,键盘输入数据时,只有按了换行键,这一行数据才进入缓冲区,可以读取。
表达式cin >> ival
从标准输入读入一个值。有两种情况会使一个istream对象的bool转型为false:读到EOF(文件结束标志)或遇到一个无效的值(输入流进入fail状态)。可以用该istream对象的成员函数good()来测试,或者直接(bool)cin来测试。
istream对象的bool转型为false的情况下,此后的所有读入动作都是无操作(nop)。直到调用istream对象的成员函数clear()来清除该对象的内部状态。
缺省情况下,输入操作符丢弃空白符、空格符、制表符、换行符以及回车。如果希望读入上述字符,或读入原始的输入数据,一种方法是使用istream的get()成员函数来读取一个字符,另一种方法是使用istream的getline()成员函数来读取多个字符。istream的read(char* addr, streamsize size)函数从输入流中提取size个连续的字节,并将其放在地址从addr开始的内存中。istream成员函数gcount()返回由最后的get()、getline()、read()调用实际提取的字符数。
输入流有三个函数来测试流状态:即bad(), fail()和eof()。ignore()用来抛掉制定个数的缓冲区中的字节。
其它的istream成员函数:putback( char c ) 将字符放回iostream;unget()往回重置“下一个”istream项;peek()返回下一个字符或EOF,但不要提取出来 。
Remove ads
输出格式化
width(int x) |
下一个输出的最小字符数目 |
fill(char x) |
填充字符 |
precision(int x) |
设置浮点数的有效数字的位数 |
操纵符(manipulator)是使用<<
或>>
算子修改流的对象.
endl |
"end line": 流中插入换行符并刷新(flush)流的输出缓冲. |
ends |
"end string": 向流中插入空字符(null character)并刷新(flush)流的输出缓冲. |
flush |
强迫流的输出缓冲写出到输出设备. |
ws |
导致输入流吃掉空白(whitespace) |
showpoint |
指示流要显示小数点与一些数字0 |
头文件中iomanip
还定义了一些manipulators。
批评
某些环境下并不提供共享版本的C++库。导致程序要静态编译入C++标准库,使得程序的尺寸变大。[7]
示例
使用C++写成的 Hello World 程序如下所示:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
在这段代码中,文件 iostream 中声明了程序所要输入和输出操作的有关信息。
下述代码创建一个文件'file.txt'并写入文本'Hello World':
#include <fstream>
int main()
{
std::ofstream file;// can be merged to std::ofstream file("file.txt");
file.open("file.txt");
file << "Hello world!\n";
file.close();// is not necessary because the destructor closes the open file by default
return 0;
}
参考文献
外部链接
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads