首页 > 编程语言 >C++

C++

时间:2023-04-07 13:34:45浏览次数:36  
标签:EOF Ctrl scanf cin C++ while 输入

EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。
在微软的DOS和Windows中,读取数据时终端不会产生EOF。此时,应用程序知道数据源是一个终端(或者其它“字符设备”),并将一个已知的保留的字符或序列解释为文件结束的指明;最普遍地说,它是ASCII码中的替换字符(Control-Z,代码26)。
在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
档案存取或其它 I/O 功能可能传回等于象征符号值 (巨集) EOF 指示档案结束的情形发生。实际上 EOF 的值通常为 -1,但它依系统有所不同。巨集 EOF会在编译原始码前展开实际值给预处理器。
C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
例如:

#include <stdio.h>
int main(){
int n;
while(scanf("%d",&n) != EOF){ 

}
return 0;
}
1
2
3
4
5
6
7
8
当上面的程序运行时,如果不加" != EOF",那么这个程序就是个死循环,会一直运行下去;加上" != EOF"后该程序就不是死循环了,如果在终端不进行输入该程序会自动结束(while的意思就是说当当前输入缓存还有东西时就一直读取,直到输入缓存中的内容为空时停止)。
在这"scanf("%d",&n) != EOF"相当于"scanf("%d",&n) != EOF",或"~scanf("%d",&n)",或"scanf("%d",&n) == 1 " 。scanf的返回值由后面的参数决定

有小伙伴会问到上面那个程序怎么结束呢?
要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while.

scanf("%d%d", &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2;如果只有a被成功读入,返回值为1;如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF,且返回值为int型。

但是在C++中不存在这种用法,但相同作用的有while((cin >> a) != 0):
以前不理解在while里面用cin >> a;是什么意思,cin是C++的输入流对象,">>"是重载的运算符,cin>>的返回值是cin对象。用这个当条件的话,通过检测其流的状态来判断结束;
(1)若流是有效的,即流未遇到错误,那么检测成功;
(2)若遇到文件结束符,或遇到一个无效的输入时(例如本题输入的值不是一个整数),istream对象的状态会变为无效,条件就为假;读取失败的时候,就不能继续读取了,那么读取操作结束,while(cin>>a)就返回false,跳出循环!
C++中的while (cin>>n,n):
他的作用是:输入一个数,这数不为0时进入循环,为0时跳出循环。
输入(cin)缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin 就会检测输入缓冲区中是否有了可读的数据,这种情况下cin对键盘上是否有作为流结束标志CTRL+Z或者CTRL+D,其检查的方式有两种:阻塞式以及非阻塞式。

阻塞式检查方式指的是只有在回车键按下之后才对此前是否有 Ctrl+Z 组合键按下进行检查,非阻塞式样指的是按下 Ctrl+D 之后立即响应的方式。如果在按 Ctrl+D 之前已经从键盘输入了字符,则 Ctrl+D的作用就相当于回车,即把这些字符送到输入缓冲区供读取使用,此时Ctrl+D不再起流结束符的作用。如果按 Ctrl+D 之前没有任何键盘输入,则 Ctrl+D 就是流结束的信号。
阻塞式的方式有一个特点:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下
————————————————

标签:EOF,Ctrl,scanf,cin,C++,while,输入
From: https://www.cnblogs.com/wbc-6/p/17295845.html

相关文章

  • C/C++机房失物招领[2023-04-07]
    C/C++机房失物招领[2023-04-07]程序设计题:机房失物招领出题人:许棣华面向专业:软件工程难度等级:41问题描述经常有一些丢三落四的同学,在不经意的时候会丢失物品。比如:在机房,每天做值日的同学都会发现有U盘、钥匙、书本等物品被落下,他们会将这些物品放在固定位置或交由工作人员......
  • A C++ program that prints itself
    #include<iostream>usingnamespacestd;intmain(){strings="cout<<\"#include<iostream>\\nusingnamespacestd;\\n\\nintmain(){\\nstrings=\\\"\";\nfor(chari:s)\nif(i==�......
  • c++ primer第一章
    11.2cinistream类型该对象被称为标准输入;coutostream对象被称为标准输出对象。cerr来输出警告和错误信息,clog来输出程序运行时的一般性消息。 写入endl的效果是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出......
  • C++/Qt网络通讯模块设计与实现(总结)
    至此,C++/Qt网络通讯模块设计与实现已分析完毕,代码已应用于实际产品中。C++/Qt网络通讯模块设计与实现(一)该章节从模块的功能需求以及非功能需求进行分析,即网络通讯模块负责网络数据包的发送、接收以及对外提供功能调用以及接口回调,其不进行产品业务的实现,达到平台化复用的目的,......
  • C++ thread 源码阅读笔记
    thread类解析构造函数thread()无参构造,会创建一个空的线程对象。thread(FunctionCallback,...Args)创建并开启一个线程,线程任务就是参数里的回调函数。thread(thread&&other)移动构造,具体请参照C++的移动语义。PS:thread类没有拷贝构造。thread(constthread&......
  • C++运算符重载
    什么是运算符重载运算符重载(Operatoroverload)是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时做出不同的行为。运算符重载的意义运算符重载的本质是函数重载,是实现多态的重要手段,为用户提供了一个直观的接口。调用运算符操作自定义数据类型其实就是调用......
  • c++primer3.5数组
    3.5 数组数组大小固定,灵活性差。3.5.1 定义和初始化内置数组数组维度是一个常量表达式,数组的元素是一个对象。不允许用auto关键字由初始值的列表推断类型,必须指定数组类型。数组无法进行拷贝。数组本身就是对象,允许定义数组的指针以及数......
  • c++字符串拆分
    1staticvoidSplitString(conststring&data,conststring&delim,2std::vector<string>*result){3std::string::size_typepos;4constintsize=data.size();56for(intindex=0;index<size;++index)......
  • C++,OpenCV-颜色模型转换(4)
    HSV颜色模型HSV模型HSV(Hue,Saturation,Value)根据颜色直观特性创建的一种颜色空间,也称六角锥体模型(HexconeModel),参数分别为色调(H),饱和度(S),明度(V)色调H用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°......
  • C++中的元编程常用工具
    std::forward : 通常是用于完美转发的,它会将输入的参数原封不动地传递到下一个函数中,这个“原封不动”指的是,如果输入的参数是左值,那么传递给下一个函数的参数的也是左值;如果输入的参数是右值,那么传递给下一个函数的参数的也是右值。std::remove_reference_t : 是一个模板......