2013-11-24 33 views
0

我只是對C中基本的流處理感到困惑。即使經過一個小時的谷歌搜索和關於這個問題的閱讀,我並不聰明(這不是我第一次嘗試深入研究這一點)。 我想從輸入中讀取數字,直到達到EOF或非數字並能夠區分這兩個數字。從我所瞭解的情況來看,這應該可行,但feofferror的條件從來都不是真的。這是爲什麼 ?有人可以給我提供一個工作代碼片段以及一個虛擬友好的深入解釋嗎?c中的基本流處理

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int number; 
    printf("number or EOF:\n"); 

    while(scanf("%d",&number) == 1) 
    { 
      printf("read number %d\n",number); 
    } 
    if(ferror(stdin))printf("error reading\n"); 
    else if (feof(stdin))printf("eof reached\n"); 
    return 0; 
} 
+1

stdin永不結束 - 它有點暫停。嘗試一個文件。 (你可能想要關於標準輸入/標準輸出/標準錯誤 - 這是特殊的流)。 – JeffRSon

+0

你如何結束你的輸入?和['ferror()'](http://en.cppreference.com/w/c/io/ferror)僅在* stream *處於錯誤狀態時才報告爲真;而不是當你輸入無效的數據時。 * *錯誤由['scanf()'](http://en.cppreference.com/w/c/io/fscanf)返回,您正在進行適當的檢查。 – WhozCraig

+0

@JeffRSon:從tty結束stdin,當你發送EOF到tty。在許多終端上,Ctrl + D會做到這一點。 –

回答

0

我的問題,理解流的行爲,我得到了一個小特點。我不知道在Windows控制檯中有一個newb不友好的模糊性,如果你輸入如12 23^Z/enter/,Ctrl + Z可以被讀爲ASCII 0x1A,但是當你做了12 23/enter/^ Z/enter/。 這段代碼解決了問題

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 


printf("int or eof\n"); 
    int num; 
    while(scanf("%d",&num) ==1) 
    { 
     printf("the read number is %d \n",num); 
    } 
    if(!feof(stdin) && getchar()!=0x1A)//first check if its read as EOF, 
      //if it fails, call getchar for help to check for ^Z 
    { 
     printf("non-int error\n"); 
    } 
    else printf("eof ok\n"); 
    system("PAUSE"); 
    return 0; 

我的誤導問題,對不起。