Подтвердить что ты не робот

Конец файла (EOF) стандартного входного потока (stdin)

Есть ли у stdin какой-либо EOF? Например, если я начинаю читать с stdin, используя fread/read, тогда, когда закончится следующий цикл?

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

Если решение выше - нет, то есть ли способ добавить EOF в stdin?

4b9b3361

Ответ 1

Говоря о EOF в stdin: при перенаправлении ввода из файла, например:

program <input.txt

файл уже имеет EOF, поэтому это не проблема. В консоли вы можете имитировать флаг EOF. В системах UNIX это Ctrl + D, в Windows Ctrl + Z. Когда вы вводите это в консоли, программа будет вести себя так, как будто она только что закончила входной файл.


Изменить

В соответствии с вопросом, заданным OP:

Значит, это означает, что у stdin нет EOF, и мы должны вставлять их вручную, используя Ctrl + Z или Ctrl + D?

Собственно - да. Можно рассматривать stdin (не перенаправленный, а взятый из консоли) как бесконечный файл - никто не может сказать, где он заканчивается. Конец входного файла, где input ist stdin, должен быть передан буквально Ctrl + D или Ctrl + Z.

Ответ 2

Я никогда не программировал C в окнах, поэтому я не могу сказать вам, но в bash, программа получит EOF при вводе конца данных (Ctrl + D)

Ответ 3

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

Вы не говорите тип c, но с использованием этого имени подразумевается, что он char. Обратите внимание, что значение EOF для iosteams составляет (int) -1. Хранение этого в unsigned char даст вам значение 255, которое не будет соответствовать EOF.

Ответ 4

Способ проверки 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

Ваше решение помечено как С++, поэтому здесь некоторые С++.

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

Ответ 6

Первый getchar() действительно getc (stdin), поэтому getc (FILE) вы можете прочитать больше. getchar() получает последний необработанный символ из потока ввода или stdin, нажимая enter, -\n. если stdin пуст, getchar заставляет паузу получить вход. Скажем в программе, которую я вызываю getchar(), сначала stdin пуст, поэтому он приостанавливается для ввода. Если я введу ab '\n', первый getchar() получит 97 ascii 'a'. в следующий раз, когда я вызову 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 []), который помещает все символы до символа newline в массив символов. Проблема с этим заключается в необходимости char [] больше ввода или вы получите ошибки. Приятная вещь получает (char []) очищает stdin, поэтому вы можете сделать бум dumby, чтобы очистить stdin или обработать его.

Надеюсь, это информативно.