2017-02-11 99 views
0

我有以下代碼(僅用於基準目的)。調用fread裏面for循環失敗

該代碼包括創建一個簡單的字符數組,將其轉儲到文件,然後在for循環內讀取它。 爲什麼讀取功能由於fopenfread返回NULL)中的失敗者而失敗,但是如果我註釋掉for循環,它會起作用嗎?

我使用蘋果的LLVM版本8.0.0(鐺 - 800.0.42.1),並與clang -o rw rw.cpp

int create(int, char**) { 

    char a[256*256]; 
    for (int i = 0; i < 256*256; i++) 
     a[i] = char(i); 

    // Dump to File 
    FILE* f = fopen("file.bin", "wb"); 
    fwrite(a, 256*256*sizeof(char), 1, f); 
    fclose(f); 

    return 0; 
} 



int read(int, char**) { 

    // IF this loop is commented out, the code works. Otherwise fails 
    for (int i = 0; i < 10000; i++) { 

     char a[256 * 256]; 

     FILE* f = fopen("file.bin", "rb"); 

     // Fails at this assertion 
     assert(f); 

     fread(a, 256*256*sizeof(char), 1, f); 

     for (int k = 0; k < 256 * 256; k++) { 
       if (a[k] != char(k)) { 
        printf("Bad Value %d %d\n", k, a[k]); 
       } 
     } 
    } 

    return 0; 

} 
+1

如果您告訴我們錯誤消息,這將有很大幫助。 –

+0

@KeineLust對不起,我犯了一個粘貼代碼的錯誤。現在糾正。 – manatttta

+0

@CharlieMartin它在斷言時失敗,'assert(f)' – manatttta

回答

4

簡單編譯你永遠不會關閉for循環內打開的文件在讀取功能。很可能,你的文件句柄已經用完了。

+0

就是這樣,謝謝:( – manatttta

1

由於只有一個文件,因此您可以將fopen語句移動到for循環之外。你不需要在循環中打開它。