C++ 的输入工作

一、C++ 控制台输入和文件输入的关系

一个控制输入的内容可以看做事一个文件的信息

  • 控制台写入方式
int i=0;
int tmp[100]; 
cin >> tmp[i];
while (i<100 && !cin.eof())
{
	i++;
	cin >> tmp[i];
}
for (int j = 0; j < i; j++)
{
	cout << tmp[j] << endl;
}

上面程序可以多次写入,也可以一次性写入。

1.多次写入:
 每次写入一个整数回车,就可以再控制台连续多次输入数据,最后Ctrl+Z添加输入结束符,结束输入数据。
2.一次写入:
 一次性写入多个数据最后加上输入结束符(1 2 3 4 5 ^Z),与上是同样的效果。


  • 文件输入方式
int i=0;
int tmp[100]; 
ifstream inFile;
inFile.open("input.txt");
inFile >> tmp[i];
while (i<100 && !inFile.eof())
{
	i++;
	inFile >> tmp[i];
}
for (int j = 0; j < i; j++)
{
	cout << tmp[j] << endl;
}

 在文件中写入多个数据最后加上输入结束符(1 2 3 4 5 ),都可以输出同样的效果。

总结:因此可以看出一个控制台的输入流可以看做是一个输入文件,只是控制台的“输入文件”在结尾处没有结尾标志

二、iostream 定义的四个标志位

  1. ios::badbit 001 输入(输出)流出现致命错误,不可挽回 (文件受损或者硬件故障)

  2. ios::eofbit 010 已经到达文件尾

  3. ios::failbit 100 输入(输出)流出现非致命错误,可挽回 (如读取类型中发生类型不匹配或者遇到eof时返回true)

  4. ios::goodbit 000 流状态完全正常, 各异常标志位都为0 (注:good() 该方法在没有发生任何错误时返回true)

因为一个控制台输入流可以看做是一个文件的输入,所以文件输入和控制台输入出现的四个标志位可以相同的去看待

1. 在有输入的程序中,在运行程序的时候想让其控制台不立刻消失会加两个cin.get(),原因就是控制台的输入流中还有一个换行符没有读取,所以需要一个cin.get()读取其中的换行符。

三、cin、get()、getline()的区别

  1. cin 读取一个char时,会省略输入流中的空格和换行符;
  2. get() 相当于c语言中的getchar,可以读取输入流中的空格和换行符;cin>>ch 方法可以轻松的跳过这些换行符,但是对于cin.get(ch)还会读取字符后输入流中还存在换行符;
  3. getline() 读取可以读取一个字符串。并忽略输入流中的换行符

写程序时,应当时刻思考输入流的状态

四、对于错误输入的处理

如果接受到错误的输入即cin.fail,则必须使用了那个cin.clear()重置输入,然后还需要通过读取不合法的输入开丢弃它们。

double factor;
while(!(cin>>factor))		//判断是否为合法的输入
{
	cin.clear();			//重置输入
	while(cin.get()!='\n')   //通过循环丢弃不合法的输入
		continue;
}
statement;  //对于正确输入factor的处理

cin是一个istream类的对象,使用cin作为输入时(例如 cin>>factor)会返回一个istream值,即cin,根据输入是否成功,被转换为bool值false或true

猜你喜欢

转载自blog.csdn.net/qq_34915122/article/details/83154393