2011-12-15 37 views
0

應用從標準輸入讀取的輸入和功能如下:問題用fread從stdin爲系統產生並手動輸入閱讀時

filepos = ftell(stdin); 
if (filepos < 0 && errno != 0) 
{ 
    perror("ftell"); 
    return 1; 
} 
if ((n = fread(input_data, sizeof(char), 2, stdin)) != 2) 
{ 
    if (n == 1) 
    { 
     if (*input_data == '\n') 
      fprintf(stderr, "Unexpected NL character read\n"); 
     else if (*input_data== '\r') 
      fprintf(stderr, "Unexpected CR character read\n"); 
     else 
      fprintf(stderr, "Unexpected character read <%c>\n", *input_data); 
    } 
    else if (n != 0 && errno != 0) 
    { 
     perror("fread"); 
    } 
    return 1; 
} 
    ... process data .... 

當我跑這通過系統產生的輸入的應用程序處理正確,當我跑這爲其手動創建相同的輸出,我收到錯誤消息「」意外NL字讀」。

$ convertInput <input.system> out 
$ 
$ convertInput <input.manual> out 
Unexpected NL character read 
$ 

這兩種情況下的輸出是正確的。

當我在兩個輸入文件之間做了差異時,它顯示如下消息。

$ diff input.manual input.system 
1c1 
< INPUT 
--- 
> INPUT 
\ No newline at end of file 

我已驗證手動輸入文件,輸入後也沒有新行。我不確定fread本身是否應該用fgets或其他來解決這個問題。

gdb顯示「fread」在「input.system」的INPUT結尾後返回「0」,而「fread」在INPUT結束後爲「input.manual」返回「\ n」。

手動文件創建爲「vim輸入」並「粘貼」數據並刪除數據結束後的所有字符(包括「\ n」)和「保存並退出」編輯器。

任何建議或想法解決這個問題,表示讚賞。

謝謝,

+0

與你的問題無關,但在'ftell'之後,你不需要檢查_both_返回值和'errno'。返回值就足夠了。在'fread'之後,使用'feof'和'ferror'來查看你是否有EOF或錯誤。 –

+0

你是什麼意思「我已經驗證了手動輸入文件,輸入後也沒有新行」?差異似乎告訴你有一個,所以它看起來像你已經驗證,有一個換行符。 –

+0

當我打開文件時,沒有「新行」。但是當我保存並退出並進行差異化時,差異顯示有一條新線。我不確定這是否是Unix中Vim的一個特性。 –

回答

0

問題取決於您創建「手動」文件的方式。如果你使用文本編輯器(vim),那麼在最後放置一個\ n是很正常的,因爲它必須完成最後的「文本」行。我寧願使用二進制編輯器來完成這項工作。據我記憶,最近vim的版本有一個「二進制模式」。另一種創建錯過最後\ n的文件的方法是使用「echo -en'...您的數據...'>文件」。 -n選項省略\ n,-e用於解釋以「\」開頭的字符序列(例如「\ n」,「\ r」...)。我希望它能提供幫助。

順便說一句,stdin上的「ftell」可能會返回無用的值,如果stdin沒有被重定向到一個真實的文件。

+1

你可以使用':set binary'和':set noeol'在vim中執行此操作。 –