C++ IO类

c++标准库中定义的IO类型有:

头文件:iostream iostream定义了用于读写流的基本类型。

头文件:fstream fstream定义了用于读写命名文件的类型。

头文件:sstream stream定义了读写内存string对象的类型。

一、.iostream类

.iostream将流数据视为一个字节接一个字节的流。如果流的目标是文件或者控制台屏幕,数据源通常是程序的一部分。如果流的方向与此相反,数据将来自键盘或磁盘文件并流入到数据变量中。

 ios类是输入流和输出流的基类,其中有个成员变量为streambuf类对象。

streambuf类用于管理缓冲区,可以填充、清空、刷新和处理缓冲区的其他功能。 


如果程序中包含了iostream头文件,那么程序启动过程中会创建并且初始化4个对象。

cin:处理标准输入设备的输入。一般指键盘输入。

cout:处理标准输出设备的输出。一般只控制台屏幕。

cerr:处理标准错误设备的输出。cerr比较特殊,每次用cerr输出的数据都不需要缓冲,会直接输出到控制台屏幕。

clog:处理输出到标准错误设备的错误信息。clog的输出是缓冲形式的,不会立即写到控制台屏幕。


cin和cout用法比较简单,这里只介绍cin中的一些函数:

cin.get() <span style="white-space:pre">						</span>//不接受任何参数,返回找到的字符值;如果文件达到文件末尾则返回EOF
cin.get(char &_ch) <span style="white-space:pre">					</span>//接收一个char类型的引用,返回一个istream对象
cin.get(char *str,StreamSize size)<span style="white-space:pre">			</span>//接收一个char类型数组,该数据存放数据,第二个参数是要读取的最大字符数量加1;
cin.get(char* str,StreamSize size,char termChar)<span style="white-space:pre">	</span>//增加了最后一个参数,表示结束字符,如果提取字符过程中还没有到达最大长度就遇到结束字符,则结束提取过程
cin.getline(char *str,StreamSize size)<span style="white-space:pre">			</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) //忽略缓冲区中的_Count个字符直到遇到termChar为止

</pre>现在用一个小程序来说明cin.ignore()用法<p></p><p> <pre name="code" class="cpp">#include<iostream>


                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值