2014-01-29 82 views
0

首先,我有這樣的:FREAD返回相同的,不管標誌

int main (void) 
{ 
    int m = 10; 
    double x[3] = {1.5, -3.5, 3.25}; 

    int n1, n2; FILE *izTok; 
    izTok = fopen ("podaci.bin", "wb"); 

    n1 = fwrite (&m, sizeof(m), 1, izTok); 
    n2 = fwrite (x, sizeof(x[0]), 3, izTok); 
    fclose(izTok); 

    return 0; 
} 

此後,我試圖從它

FILE *stream; 
    stream = fopen("podaci.bin", "r"); 

    n1 = fread(&n, sizeof(n), 1, stream); 
    n2 = fread(arr, sizeof(arr[0]), 3, stream); 

    printf("%d %f %f %f", n, arr[0], arr[1], arr[2]); 

而且不管我是否把

閱讀
stream = fopen("podaci.bin", "r"); 

stream = fopen("podaci.bin", "rb"); 

輸出是一樣的

10 1.500000 -3.500000 3.250000 

請告訴我標誌的點,如果它做同樣的事情兩次?

回答

3

在所有的POSIX系統上,b標誌被忽略並且沒有意義。從man 3 fopen Linux系統上:

模式串還可以包括字母「b」既可作爲最後 字符或如上述任何 兩個字符的字符串的字符之間的字符。這是嚴格爲 與C89兼容,並沒有影響; 所有符合POSIX標準的系統(包括Linux)都忽略'b'。 (其他系統 可能會以不同的方式處理文本文件和二進制文件,如果您對二進制文件執行I/O並且希望程序可能移植到非UNIX環境,則添加「b」可能是個好主意。 )

在Windows上,b表示數據未被更改。否則,使用文本模式,其描述爲here。其中,行結束符被轉換,CTRL + Z被解釋爲文件結束符。

1

文本和二進制文件的區別取決於您的系統。許多* nixes指出,在這些系統上,它們之間沒有區別。 Windows將在文本模式下在「\ n」和「\ r \ n」之間進行轉換(在寫入和讀取時添加一個字節)。如果你沒有在你的二進制數據中使用這些字節,那麼你也不會注意到它們之間的差異。

1

標誌的一點是一些操作系統對文本和二進制流的處理方式不同。你的可能不會。但它仍然可能:如果作爲二進制值的雙精度值包含一個值爲'\ r'的字節,您可能會驚訝地發現您讀取的數字取決於您使用「r」還是「rb」打開文件。