一、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 定义的四个标志位
-
ios::badbit 001 输入(输出)流出现致命错误,不可挽回 (文件受损或者硬件故障)
-
ios::eofbit 010 已经到达文件尾
-
ios::failbit 100 输入(输出)流出现非致命错误,可挽回 (如读取类型中发生类型不匹配或者遇到eof时返回true)
-
ios::goodbit 000 流状态完全正常, 各异常标志位都为0 (注:good() 该方法在没有发生任何错误时返回true)
因为一个控制台输入流可以看做是一个文件的输入,所以文件输入和控制台输入出现的四个标志位可以相同的去看待
1. 在有输入的程序中,在运行程序的时候想让其控制台不立刻消失会加两个cin.get(),原因就是控制台的输入流中还有一个换行符没有读取,所以需要一个cin.get()读取其中的换行符。
三、cin、get()、getline()的区别
- cin 读取一个char时,会省略输入流中的空格和换行符;
- get() 相当于c语言中的getchar,可以读取输入流中的空格和换行符;cin>>ch 方法可以轻松的跳过这些换行符,但是对于cin.get(ch)还会读取字符后输入流中还存在换行符;
- 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