c++标准库中定义的IO类型有:
头文件:iostream iostream定义了用于读写流的基本类型。
头文件:fstream fstream定义了用于读写命名文件的类型。
头文件:sstreamstream定义了读写内存string对象的类型。
一、.iostream类
.iostream将流数据视为一个字节接一个字节的流。如果流的目标是文件或者控制台屏幕,数据源通常是程序的一部分。如果流的方向与此相反,数据将来自键盘或磁盘文件并流入到数据变量中。
ios类是输入流和输出流的基类,其中有个成员变量为streambuf类对象。
streambuf类用于管理缓冲区,可以填充、清空、刷新和处理缓冲区的其他功能。
如果程序中包含了iostream头文件,那么程序启动过程中会创建并且初始化4个对象。
cin:处理标准输入设备的输入。一般指键盘输入。
cout:处理标准输出设备的输出。一般只控制台屏幕。
cerr:处理标准错误设备的输出。cerr比较特殊,每次用cerr输出的数据都不需要缓冲,会直接输出到控制台屏幕。
clog:处理输出到标准错误设备的错误信息。clog的输出是缓冲形式的,不会立即写到控制台屏幕。
cin和cout用法比较简单,这里只介绍cin中的一些函数:
cin.get() <span > </span>//不接受任何参数,返回找到的字符值;如果文件达到文件末尾则返回EOF
cin.get(char &_ch) <span > </span>//接收一个char类型的引用,返回一个istream对象
cin.get(char *str,StreamSize size)<span > </span>//接收一个char类型数组,该数据存放数据,第二个参数是要读取的最大字符数量加1;
cin.get(char* str,StreamSize size,char termChar)<span > </span>//增加了最后一个参数,表示结束字符,如果提取字符过程中还没有到达最大长度就遇到结束字符,则结束提取过程
cin.getline(char *str,StreamSize size)<span > </span>//该函数就是从控制台屏幕读取一整行数据放置字符数组中,size表示最大字符数;
cin.getline(char* str,StreamSize size,char termChar) //增加了终止字符,其余参数和上一个函数相同
using namespace std;
int main()
{
//两个字符数组存储从控制台读取的数据
char stringOne[255];
char stringTwo[255];
//读取数据至stringOne,注意采用了get函数,get函数会将换行符'\n'丢弃在缓冲区
cout << "Enter string one:";
cin.get(stringOne, 255);
cout << "string One:" << stringOne << endl;
/*读取数据至stringTwo,因为缓冲区中现在剩下一个换行符'\n'
getline()函数直接读取到了换行符'\n',不需要用户输入,直接返回
根据已知的知识得知getline()读取到换行符'\n'之后直接丢弃换行符,
因此stringTwo为空
*/
cout << "Enter String Two";
cin.getline(stringTwo, 255);
//会注意到stringtwo不等输入,直接输出
cout << "String two:" << stringTwo << endl;
cout << "Now let use ignore function" << endl << endl << endl;
//这一次和上一次的操作一模一样,只是采用了cin.ignore()函数
cout << "Enter string one:";
cin.get(stringOne, 255);
cout << "StringOne:" << stringOne << endl;
cout <<"Enter string two:";
//调用cin.ignore()函数直接忽略掉缓冲区中的换行符'\n',
//忽略换行符'\n'缓冲区为空,于是等待输入
cin.ignore(255, '\n');
cin.getline(stringTwo, 255);
cout << "stringTwo:" << stringTwo << endl;
//下面这个例子告诉我们ignore()函数中两个条件,只要一个到达要求就会停止忽略
char stringThree[10];
char stringFour[10];
/*
如果你输入 Open with Code
cin.get()函数读取到的是Ope,因为get函数中streamSize是读取到的最大字符数+1个换行符
cin.getline()函数读取到的是with Code
*/
cout << "请输入一段英文句子,句子中至少有8个字母"<<endl;
cin.get(stringThree, 4, '\n');
cout << "StringThree中的数据是:"<<stringThree << endl;
//系统忽略2个字母,即使一直没碰到换行符'\n',系统也只会忽略两个字母
cin.ignore(2, '\n');
cin.getline(stringFour, 255);
cout <<"stringFour中的数据是"<< stringFour<<endl;
return 0;
}
注:
StreamSize 参数大小之所以是最大字符数量加1是因为读取了响应长度的字符之后,还需要在该字符数据末尾加上空字符表示字符串结束标志。
在遇到结束字符termchar后,不会读取termchar字符,而是直接在字符数组末尾添加空字符
带参数的get()函数其返回值全部都是istream对象而cin.getline()两个版本函数都返回istream对象
带参数的cin.get()和cin.getline()相比较,cin.get()在读取数据中遇到终止符会结束提取,不会提取终止符,终止符最终还是留在输入缓冲区。而getline()会提取终止符,并且提取之后没有放入我们存储数据的字符数组而是立即丢弃它。
<pre name="code" class="cpp">int a;
double b;
string c;
char d;
cin>>a>>b>>c>>d;//正确,cin>>之后返回一个istream对象,可以继续提取数据
cin.get()>>a>>b>>c>>d;//错误,cin.get()返回值不是istream对象,不能级联式的提取
这个代码片段明确的标明了cin>>和cin.get()的返回值的区别。
cin.ignore(StreamSize _Count,char termChar)
</pre>现在用一个小程序来说明cin.ignore()用法<p></p><p> <pre name="code" class="cpp">#include<iostream>