cin函数的一点理解

简介: 问题 最近学习C++碰到这样一个问题,while(cin>>s){},这样的一个语句用什么样的输入能够结束运行,到网上一查,大家给出的答案是ctrl+z,可以使该程序结束。但是,对于ctrl+z的作用和ctrl+z的实质是什么却都没有深刻的剖析。

问题

最近学习C++碰到这样一个问题,while(cin>>s){},这样的一个语句用什么样的输入能够结束运行,到网上一查,大家给出的答案是ctrl+z,可以使该程序结束。但是,对于ctrl+z的作用和ctrl+z的实质是什么却都没有深刻的剖析。于是,翻书找到了些内容,认为自己解决了这个问题。现将学习到的内容记录如下。首先,先了解一下,究竟能是一个输入流停止工作的有哪些条件。

流的状态

流有正常的状态和错误的状态。流只有在正常的状态下,才能够正常的工作。输入流在正常的工作状态下,才能够执行读的操作。ctrl+z,的作用其实就是让流从正常的工作状态,转为不工作的其实也可以说是错误的工作状态,所以才能让while(cin>>s){}这样的语句结束。

每个流对象都维护了一组条件标志,通过这些条件标志,可以监视流当前的状态。可以调用下面四个谓词成员函数:

1.如果一个流遇到文件结束符,eof返回true。

if(inOut.eof())

  //ok,都读进来了

2.如果试图做一个无效的操作,比如seeking重定位操作超出了文件尾。则bad()返回true。一般地,这表示该流由于某种未定义的方式而被破坏了。

3.如果操作不成功,如打开了一个文件流对象失败或者遇到了一种无效的输入格式,则fail()返回true

ifstream iFile(filename,ios_base::in);

if(iFile.fail())//不能打开

  error_message(........);

4.如果其他条件都不为true,则good()返回true。

if(inOut.good())

显示地修改流对象的条件状态有两种方式。第一,使用clear()成员函数,可以把条件状态复位到一个显式的值。第二,使用setstate()成员函数。

测试

int main(){

cout<<cin<<endl;

string s;

while(cin>>s)

{

  cout<<s;

}

cout<<cin<<endl;

}

输入 a enter b enter ctrl+z enter ctrl+z enter

运行结果:

00480F20

a b

00000000

ctrl+z究竟是什么

ctrl+z的作用是结束流,相当于eof。

总结

if(!cin)

流不能正常工作

else

流能正常工作

写程序的时候,可能要注意这点。ctrl+z只是一个小插曲,但是能从中学到些东西,感觉到欣慰。。。。

目录
相关文章
|
7月前
|
编译器 C语言 C++
scanf函数
该文介绍了C语言中`scanf`函数用于输入变量值,而`printf`函数用于输出变量值。`scanf`在读取数值时会自动过滤空白字符,允许数据间有空格或换行,不影响解析。`scanf`返回值表示成功读取的变量数,0表示未读取或匹配失败,EOF表示读取错误或文件结尾。常见占位符包括 `%c`(字符)、`%d`(整数)、`%f`(浮点数)、`%s`(字符串)和`%[]`(指定字符集)。对于`%c`,不会忽略空白字符,但可加空格跳过前导空白。文章还提及在VS2022中,`scanf`被认为是不安全的,推荐使用`scanf_s`,并提供了如何在VS中使用`scanf`的解决方法。
125 1
|
5月前
|
存储 监控 C++
cout.tellp()和cout.seekp()语法介绍
C++ 中的 `cout.tellp()` 用于获取输出流缓冲区的当前位置,而 `seekp()` 可以改变这个位置。数据先存入缓冲区,待缓冲区刷新后才输出。`tellp()` 返回一个表示位置的 `streampos`(通常可转换为整数),在无数据时为0,失败时为-1。`seekp()` 用于设置下一个字符的输出位置,接受一个位置参数或偏移量和方向,允许在缓冲区中移动并覆盖已有数据。例如,可以使用 `seekp()` 改变输出流中的部分数据,然后继续写入。
69 12
c中scanf函数注意点
c中scanf函数注意点
80 0
C++的输入与输出:cin与cout
C++的输入与输出:cin与cout
|
存储 监控 C++
C++ 的cout.tellp()和cout.seekp()语法介绍
无论是使用 cout 输出普通数据,用 cout.put() 输出指定字符,还是用 cout.write() 输出指定字符串,数据都会先放到输出流缓冲区,待缓冲区刷新,数据才会输出到指定位置(屏幕或者文件中)。 值得一提的是,当数据暂存于输出流缓冲区中时,我们仍可以对其进行修改。ostream 类中提供有 tellp() 和 seekp() 成员方法,借助它们就可以修改位于输出流缓冲区中的数据。 C++ tellp()成员方法 首先,tellp() 成员方法用于获取当前输出流缓冲区中最后一个字符所在的位置,其语法格式如下: streampos tellp(); 显然,tellp()
129 0
|
人工智能
scanf函数与getchar函数区别
scanf函数与getchar函数区别
147 0
|
C语言 C++
C++ 中的 cout.setf() 函数
C++ 中的 cout.setf() 函数
C++ 中的 cout.setf() 函数
cin详解
cin详解
121 0
|
Unix C语言 iOS开发
C++cin,cout以及常见函数总结,cin,cout格式化控制
C++cin,cout以及常见函数总结,cin,cout格式化控制
C++cin,cout以及常见函数总结,cin,cout格式化控制
|
C++
关于scanf函数在VS中使用的问题
关于scanf函数在VS中使用的问题
150 0
关于scanf函数在VS中使用的问题