C++输入输出流(iostream
library)为内置数据类型和文件提供了输入输出操作支持,是一个使用频率很高的库。本文列出了iostream库一些基础问题和值得注意的特性,特别是与C语言不同的重载操作符及格式状态等。很久之前总结的,现在看起来也蛮有意思。
1. cin, cout
和 cerr
分别是什么?
istream(输入流)和ostream(输出流)是负责输入输出的类,iostream类是istream和ostream的派生类,允许双向输入输出。cin是标准输入,它是istream类的一个对象,作用是从终端读数据;cout是标准输出,它是ostream类的一个对象;作用是向终端写数据;cerr是标准错误,它也是ostream类的一个对象,作用是到处程序的出错消息。
注:cout 是带缓存的输出流,cerr是不带缓冲的输出流。当我们写
cout <<
“Hello, World!”
常量字符串被存储在与cout
相关联的缓冲区中,当缓冲区被刷新的时候字符将被写到标准输出上。常见简单的刷新的方法:
cout <<
“Hello, World!” << flush; //
直接刷新
cout <<
“Hello, World!” << ends; //
插入空格后刷新
cout <<
“Hello, World!” << endl; //
插入换行后刷新
cerr <<
“This is error!” // 无缓冲,直接写到标准输出上
2. 用cout
怎么样输出指针地址?
iostream库提供了指针类型的预定义输出操作符,允许显示对象的地址。缺省情况下这些值以十六进制的形式显示。如:
int i = 1024;
int *pi =
&i;
cout <<
"The address of int i is:" <<
&i <
cout <<
“The address of int i is:” << pi
<
输出如下:
The address of int i is:
0012FF70
The address of int i is:
0012FF70
3. 用cout
怎么输出C风格常量字符串的指针?
程序如下:
const char *str =
"vermeer";
cout <<
"The address of str is: " << str
<< endl;
printf("The address of str is: %x\n",
str);
输出如下:
Then address of str is:
vermeer
Then address of str is:
4740fc
Cout默认把const char *解释为C风格常量字符串,而不是其指针地址。
可以用一下的转型得到想要的结果:
<<
static_cast(const_cast(pstr))
首先把const强制转换掉,然后再转成void类型。
4.
istream对象何时为false?
可以用后面的表达式从cin读入一个值序列:while ( cin
>> ival )
例子如下:
#include
#include
int main()
{
vector ivec;
int ival;
while ( cin
>> ival )
ivec.push_back( ival );
// ...
}
此表达式表示:从标准输入读入一个序列,直到cin为false为止。
以下两种情况会使一个istream对象被计算为false:
1) 读到文件结束时(已经正确读完文件中的值)
2) 遇到无效的值。
所以可以用一下代码使程序更健壮
if ( ! cin )
cerr <<
"error: invalid int type entered!\n";
5.
istream的成员函数get()的用法?
1) 方式一:
get(char
&ch):
从输入流中提取一个字符,包括空白字符并将它存储在ch 中,它返回被应用的istream 对象。
ifstream inFile( infile_name.c_str()
);
ofstream
outFile(outfile_name.c_str());
char ch;
while (inFile.get(ch))
outFile.put(ch);
2) 方式二:
get():
从输入流中提取一个字符,区别是它返回该字符值而不是被应用的istream 对象它的返回类型是int 而不是char。为测试返回值是否为文件尾,我们将它与iostream 头文件中定义的常量EOF 做比较。被指定用来存放get()返回值的变量应该被声明为int 类型,以便包含字符值和EOF
int ch;
while((ch = cin.get()) !=
EOF)
cout.put(ch);
3) 方式三:
get(char *buf, streamsize size, char
delimiter='\n')