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

时间:2010-07-07 16:52:34

标签: c++ c

stdin有没有EOF?例如 - 如果我使用fread / read从stdin开始读取,那么下一个循环将结束?

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

如果上述解决方法为否,那么有没有办法在stdin中添加EOF?

6 个答案:

答案 0 :(得分:27)

谈谈stdin中的EOF:当你从文件重定向输入时,例如:

program <input.txt

该文件已有EOF,因此这不是问题。在控制台中,您可以模拟EOF标志。在UNIX系统中,它是 Ctrl + D ,在Windows Ctrl + Z 中。当您在控制台中键入此内容时,程序将表现得像刚刚到达输入文件的末尾。


修改

根据OP提出的问题:

  

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

实际上 - 是的。可以将stdin(未重定向,但从控制台中取出)视为无限文件 - 没有人能分辨出它的结束位置。输入文件的结尾,输入ist stdin,必须按 Ctrl + D Ctrl + Z

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

测试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
}

答案 4 :(得分:0)

您的解决方案标记为C ++,因此这里有一些C ++。

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

答案 5 :(得分:0)

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

为了证明这写了这段代码。

    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 [])将所有字符放到newline中,直到字符数组。这个问题是你需要一个大于输入的char [],否则你会得到错误。好处是gets(char [])确实清除了stdin,因此您可以创建一个dumby缓冲区来清除stdin或处理它。

我希望这是有用的。