代码之家  ›  专栏  ›  技术社区  ›  Ravi Gupta

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

c c++
  •  15
  • Ravi Gupta  · 技术社区  · 14 年前

    stdin有EOF吗?例如,如果我开始使用 fread read ,那么下面的循环是否结束?

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

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

    6 回复  |  直到 4 年前
        1
  •  29
  •   Archie    12 年前

    谈论 EOF

    program <input.txt
    

    文件已具有 EOF公司 EOF公司 旗帜。在UNIX系统中是这样的 Ctrl键 + D ,在Windows中 + Z


    编辑

    根据OP提出的一个问题:

    实际上——是的。人们可能认为stdin(不是重定向的,而是从控制台获取的)是 文件--没人能知道它在哪里结束。输入文件的结尾,其中输入是stdin,必须通过 + D Ctrl键 + Z .

        2
  •  4
  •   sui    14 年前

        3
  •  2
  •   Donald Duck    7 年前
    while ((c = read(0, buffer, BUFSIZ)) > 0) { 
    

    c 但使用这个名字意味着它是一个 char . 请注意,iosteams的EOF值是 (int) -1

        4
  •  0
  •   anon anon    14 年前

    测试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
    }
    
        5
  •  0
  •   Puppy    14 年前

    你的解决方案是标记C++,所以这里有一些C++。

    std::string lols;
    while(!(std::cin >> lols).eof()) { // This loop will end when EOF is reached
        // Process string
    }
    
        6
  •  0
  •   user1364455    11 年前

    第一个getchar()实际上是getc(stdin),所以getc(FILE)可以从中读取更多内容。getchar()从输入流或stdin中获取最后一个未处理的字符,按enter键是“\n”。如果stdin为空,getchar将强制暂停以获取输入。 假设在一个程序中,我首先调用getchar(),stdin是空的,所以它暂停输入。如果输入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(),可能会导致错误。正如人们提到的,您可以使用get(char[]),它将换行之前的所有字符放入字符数组。问题是你需要一个大于输入的char[],否则你会出错。好在gets(char[])确实清除了stdin,所以您可以创建一个dumby缓冲区来清除stdin或处理它。

    我希望这是有益的。