繁体   English   中英

标准输入流 (stdin) 的文件结尾 (EOF)

[英]End of File(EOF) of Standard input stream (stdin)

stdin 有 EOF 吗? 例如,如果我使用freadread从 stdin 开始read ,那么以下循环会结束吗?

while ((c = read(0, buffer, BUFSIZ)) > 0) {
    .
    .
    .
}

如果这个问题的答案是否定的,那么有没有办法将 EOF 添加到标准输入中?

谈到标准输入中的EOF :当您从文件重定向输入时,例如:

program <input.txt

该文件已经有一个EOF ,所以这不是问题。 在控制台中,您可以模拟EOF标志。 在 UNIX 系统中是Ctrl + D ,在 Windows 中是Ctrl + Z 当您在控制台中键入此内容时,程序的行为就像刚刚到达输入文件的末尾一样。


编辑

根据OP提出的一个问题:

那么这是否意味着标准输入没有 EOF,我们必须使用 Ctrl+Z 或 Ctrl+D 手动插入它们?

其实,是。 人们可能会将 stdin(未重定向,而是从控制台获取)视为无限文件——没有人知道它在哪里结束。 输入文件的结尾,其中 input ist stdin,必须通过Ctrl + DCtrl + Z从字面上告诉。

我从来没有在 Windows 中编写过 C,所以我不能告诉你,但是在 bash 中,当你输入数据结束时,程序会得到一个 EOF (Ctrl+D)

while ((c = read(0, buffer, BUFSIZ)) > 0) {

您没有说c的类型,但使用该名称意味着它是一个char 请注意,iosteams 的 EOF 值是(int) -1 将其存储到无符号字符中将使您获得与 EOF 不匹配的 255 值。

首先 getchar() 实际上是 getc(stdin) 所以 getc(FILE) 你可以从中阅读更多。 getchar() 从输入流或标准输入中获取最后一个未处理的字符,按 Enter 是 '\\n'。 如果标准输入为空 getchar 强制暂停以获取输入。 说在一个程序中,我首先调用 getchar() 标准输入是空的,所以它暂停输入。 如果我输入 ab'\\n',第一个 getchar() 将得到 97 'a' 的 ascii。 下次我调用 getchar() 时,我将得到 b ,然后 getchar() 将再次得到 '\\n'。

为了证明这一点,请编写此代码。

    int choice;

    do
   {
      cout << "Enter input:" ;
      choice = getchar(); 
      cout << "Last getchar(): " << choice << ":" << (char) choice ; 
       if( choice == '0' || choice == EOF)
         {
           cout << "Exited loop" << endl;     // EOF is ctrl+z in windows 
           break;
         }

   }while(true);

我确实相信 stdin 是全局的,因此在调用 getchar() 或类似函数以清除流之前,字符会保留在那里,如果您在其他地方使用 getchar() 可能会在以后导致错误。 正如人们所提到的,您可以使用 gets(char[]) 将所有字符直到换行符放入字符数组中。 问题是你需要一个比输入大的 char[] 否则你会得到错误。 好消息是 gets(char[]) 确实清除了标准输入,因此您可以制作一个笨拙的缓冲区来清除标准输入或处理它。

我希望这是信息性的。

测试EOF的方法是检查fread的返回值,然后使用feof:

while( fread( ... ) ) {    // loop so long as fread does not return zero
    // do something
}

if ( feof( stdin ) ) {
   // read failed because of EOF
}
else {
   // some other error
}

您的解决方案被标记为 C++,所以这里有一些 C++。

std::string lols;
while(!(std::cin >> lols).eof()) { // This loop will end when EOF is reached
    // Process string
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM