2015-09-11 192 views
-2

我對C有點新,但基本上我有一個問題,我需要從文件中讀取'-1'。可悲的是,這意味着我遇到了文件的過早結尾,因爲EOF常量在我的編譯器中也是-1。C - 使用fscanf從文件中讀取'-1'

這會有什麼樣的解決方法?是否有另一個函數可以用來讀取它,將EOF更改爲我可以使用的東西?

在此先感謝。

,因爲人們都在問它

int read() { 
    int returnVal; // The value which we return 

    // Open the file if it isn't already opened 
    if (file == NULL) { 
     file = fopen(filename, "r"); 
    } 

    // Read the number from the file 
    fscanf(file, "%i", &returnVal); 

    // Return this number 
    return returnVal; 
} 

這個數字是後來比較EOF的代碼。

好吧,這可能是不好的做法,但我改變了代碼以下

int readValue() { 
    int returnVal; // The value which we return 

    // Open the file if it isn't already opened 
    if (file == NULL) { 
     file = fopen(filename, "r"); 
    } 

    // Read the number from the file 
    fscanf(file, "%i", &returnVal); 

    if (feof(file)) { 
     fclose(file); 
     return -1000; 
    } 

    // Return this number 
    return returnVal; 
} 

因爲我知道我永遠不會從我的文件中讀出任何這樣的數字(它們的範圍從約[-300,300]感謝您的所有幫助傢伙!

+0

EOF常量是-1並不重要......應該永遠不會檢查您讀取的值,並且因-1以外的任何原因返回爲-1(或者什麼都不是)被讀取,你的記憶碰巧包含-1)。發佈你認爲你遇到問題的代碼,你可以得到幫助,但沒有這個問題,堆棧溢出標準是不完整的。 – mah

回答

4

的fscanf的返回值是不是被閱讀的價值,而是它是項目的數量成功讀取,或EOF如果發生錯誤。

+0

@Mildan'fscanf'至少提供*兩個*值:函數狀態作爲其返回值,以及格式要求/指針參數指定的值。仔細閱讀手冊頁。您應該始終檢查'scanf'系列的返回值以及感興趣值的範圍。 –

+0

所以,我應該添加一個檢查,看看fscanf是否返回<0項目,如果它不,那麼它會讀空行,因此EOF? – Mildan

+0

@Mildan你檢查它是否返回想要讀取的項目數,在本例中爲'1'。如果不是,你需要一個回退策略,或者作爲另一個答案,通過將其傳遞給調用者,使其爲'int readval(int * returnVal)',當然也可以從'&returnVal'改變fscanf參數到'returnVal',而不是返回'returnVal',你將返回'fscanf'的返回值。困惑?不要使用像'read'或'returnVal'這樣的標識符。 –

1

的問題是你的read函數不區分成功讀取和錯誤條件之間。您應該將其更改爲接受int *作爲scanf寫入的參數,並且該函數應該在成功讀取時返回類似於0的值,並在返回錯誤時返回-1。您可以使用返回值scanf作爲函數返回的基礎。

此外,還有一個名爲read的系統調用,所以你應該真的把它命名爲別的東西。並且在函數結束時不要忘記fclose(file),否則會泄漏文件描述符。

+0

我會嘗試他們;) – Mildan