stdin有没有EOF?例如 - 如果我使用fread / read从stdin开始读取,那么下一个循环将结束?
while ((c = read(0, buffer, BUFSIZ)) > 0) {
.
.
.
}
如果上述解决方法为否,那么有没有办法在stdin中添加EOF?
答案 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或处理它。
我希望这是有用的。