以下是我的代码,我想从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条件信号?
答案 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()
永远不会成真。