C ++使用cin.get获取一个字符,但在遇到EOF时不会结束while循环

时间:2016-05-31 01:51:45

标签: c++ eof

以下是我的代码,我想从stdin中读取字符,并在遇到EOF(ctrl-z)时结束。

package test;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class DateParsingTest {

    public static void main(String[] args) {
        String dateAsString = "2016-May-30";
        DateFormat format = new SimpleDateFormat("YYYY-MMM-dd", Locale.ENGLISH);
        try {
            Date dateAsDate = format.parse(dateAsString);
            System.out.println("dateAsDate = " + dateAsDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

我测试了这样的输入:

#include<iostream>
#include<fstream>
#include<stdio.h>
#include<string>
using namespace std;

int main()
{
    string article ;    
    char nextChar;
    while( cin.get(nextChar) ) {
        if( cin.eof() ) break ;
        article.append(1, nextChar) ;
    }

    cout << article ;

    system("pause") ;
}

然后我按回车,但它没有停止。

当我输入另一个[ctrl-z],然后按neter。

它可以退出while循环。

为什么第一个[ctrl-z]不发出eof条件信号?

1 个答案:

答案 0 :(得分:1)

以下说明略有简化。

这是您的操作系统的一项功能。这就是您的操作系统的工作方式。

文件的结尾实际上是返回0的基础read()系统调用。文件的结尾不是CTRL-Z。操作系统会解释CTRL-Z以刷新其交互式密钥缓冲区,并使进程read()成为其内容。

当您输入终端时,在按下Enter之前,该过程实际上不会读取任何内容。那时read()系统调用完成,并返回已读取的所有内容。通常,在按Enter之前,您可以退格并编辑您输入的内容,并且您的程序没有任何迹象表明您已编辑过任何内容,所有read()s是该行的最终内容按Enter后。

如果您输入内容,然后按CTRL-Z,则输入的类型输入也是read(),就好像输入了一样。

只有在没有输入任何内容且按下CTRL-Z时,基础read()系统调用才返回0,因为没有先输入任何内容;这被解释为文件结束指示。但是如果首先输入了某些内容,则需要输入CTRL-Z两次,输入一次输入read(),然后清除输入缓冲区,然后再次CTRL-Z,以导致read()0。

顺便说一下,你的代码有一个无害的bug。如果cin.get()成功,则cin.eof()永远不会成真。