2015-04-05 253 views
0

只是为了好奇心。在解决问题的过程中,很多问题都会提到:“输入将会被终止。”Ctrl + z“。我知道它的 “EOF(文件的结束)” 可是......Ctrl Z的工作原理

while(scanf("%d",&a)==1) 
{ cout<<"OK"<<endl;} 

while(scanf("%d",&a)!=EOF) 
{cout<<"OK"<<endl;} 

while(cin>>a) 
{cout<<"OK"<<endl;} 

以上3将按Ctrl +ž被终止。

while(scanf("%d",&a)) 
{cout<<"OK"<<endl;} 

它将按按Ctrl +ž OK。 和

while(1){cin>>a; 
cout<<"OK"<<endl;} 

它是一个无限循环。

我想知道如何使用Ctrl + z适用于程序终止。背后的原因是什么?请详细回答。

+0

哦,对,然后从不知道。 – JBL 2015-04-05 13:46:06

+1

@NafeeurRahman:你没有提到你正在谈论Windows专门引起了一些混淆 - 人们认为你正在谈论一个适当的操作系统,其中Ctrl Z做了一些不同的事情。我已经为您的问题添加了Windows标记以避免更多混淆。 – 2015-04-05 13:50:03

回答

2

Ctrl + z不终止您的程序。它也不会暂停执行。这是一个0x1A字节,由iostreamstdio方法解释为EOF(文件结束)。在从控制台读取字符之后,没有进一步读取,并且正在读取它的方法返回。在iostream的情况下,std::ios::eof()成为现实。

你会在你的最后通知的情况下,如果你把它作为:

while(cin >> a) { ... }

将退出其他人一样。

+0

谢谢你的回答。我想知道为什么Ctrl + Z在第四种情况下无法正常工作?按下Ctrl + Z之后,它也会输入。但为什么? – 2015-04-05 20:07:59

+0

@NafeeurRahman,在第四种情况下,当您输入Ctrl + Z时,'scanf'将返回'EOF'(通常为-1),所以循环重复。 – eryksun 2015-04-05 20:44:30

+0

在较低级别,Windows ['ReadFile'](https://msdn.microsoft.com/en-us/library/aa365467)也会涉及到。对于默认['ENABLE_PROCESSED_INPUT'](https://msdn.microsoft.com/en-us/library/ms683167)模式下的控制台输入句柄,如果它读入的缓冲区以Ctrl + Z(0x1A)开头, ReadFile'将'lpNumberOfBytesRead'设置为0. AFAIK,这是没有记录的。 – eryksun 2015-04-05 20:50:39