标准inputstream(stdin)的文件结尾(EOF)

stdin有没有EOF? 例如 – 如果我开始阅读从标准input使用FRAD /读,然后当下面的循环将结束?

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

如果上面的解决scheme是否定的,那么有没有办法在stdin中添加EOF?

在stdin中说到EOF :当你从文件redirectinput时,例如:

 program <input.txt 

该文件已经有一个EOF ,所以这不是一个问题。 在控制台中,您可以模拟EOF标志。 在UNIX系统中,它是Ctrl + D ,在Windows Ctrl + Z中 。 当你在控制台input这个信息时,程序就会像刚到达input文件那样。


编辑

根据OP提出的问题:

那么这是否意味着stdin没有EOF,我们必须使用Ctrl + Z或Ctrl + D手动插入它们?

其实,是。 有人可能会认为stdin(不是redirect,而是从控制台取得)作为无限的文件 – 没有人能够知道它在哪里结束。 input文件的结尾,必须通过Ctrl + DCtrl + Z逐字input。

我从来没有在窗口中编程C,所以我不能告诉你,但在bash中,当你input数据结束(Ctrl + D)时,程序会得到一个EOF,

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

你不说c的types,但使用这个名字就意味着它是一个char 。 请注意,iosteams的EOF值是(int) -1 。 将它存储到一个无符号的字符会得到你的价值255不符合EOF。

testingEOF的方法是检查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 } 

你的解决scheme被标记为C ++,所以这里是一些C ++。

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

第一个getchar()实际上是getc(stdin),所以getc(FILE)可以从中读取更多。 getchar()从inputstream或标准input中得到最后一个未处理的字符,按回车是'\ n'。 如果stdin为空,则getchar强制暂停以获取input。 在一个程序中说我首先调用getchar(),stdin是空的,所以它暂停input。 如果我inputab'\ n',第一个getchar()会得到'a'的ascii。 下一次我调用getchar()我会得到b,然后再次getchar()将有'\ n'。

为了certificate这个写代码。

  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()或类似的函数被调用它来清除stream中的字符留在那里,如果你在其他地方使用getchar(),可能会导致错误。 正如人们已经提到的,你可以使用gets(char []),把所有的字符都放到换行符中。 这个问题是你需要一个大于input的char [],否则你会得到错误。 好的是get(char [])清除stdin,所以你可以使一个dumby缓冲区来清除stdin或者处理它。

我希望这是信息。