Конец файла (EOF) стандартного входного потока (stdin)
Есть ли у stdin какой-либо EOF? Например, если я начинаю читать с stdin, используя fread/read, тогда, когда закончится следующий цикл?
while ((c = read(0, buffer, BUFSIZ)) > 0) {
.
.
.
}
Если решение выше - нет, то есть ли способ добавить EOF в stdin?
Ответы
Ответ 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 или обработать его.
Надеюсь, это информативно.