[英]End of File(EOF) of Standard input stream (stdin)
stdin 有 EOF 吗? 例如,如果我使用fread
或read
从 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 + D或Ctrl + 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.