2011-04-14 59 views
0

在我的代碼中,正如我所知道的,正在寫入文件。當我看到在文件中floats.dat我看到的二進制ÍÌ[email protected]@ÍÌÜ@ffFAßOeA^@^@bBf6zE33äCff<83>BÍ̦Bfwrite不能確定爲什麼

但是我的程序總是最終觸發這個if語句此流:

if(fread(inputFloats, sizeof(float), LENGTH, binaryFile) < LENGTH) 
{ 
    fprintf(stderr, "Problem reading some or all data from %s\n\n", binaryFileName); 
    return EXIT_FAILURE; 
} 

是否有人看到一些我做錯了嗎?下面的完整代碼。

#include <stdlib.h> 
#include <stdio.h> 
#define LENGTH 10 

int main(void) 
{ 
    FILE *binaryFile, *textFile; 
    char *binaryFileName = "floats.dat", *textFileName = "floats.txt"; 
    float floats[LENGTH] = {3.2, 3.55, 6.9, 12.4, 14.332, 56.5, 4003.4, 456.4, 65.7, 83.4}; 
    float inputFloats[LENGTH]; 
    int i; 

    if((binaryFile = fopen(binaryFileName, "r+")) == NULL) 
    { 
     fprintf(stderr, "Problem opening %s", binaryFileName); 
    } 

    if(fwrite(floats, sizeof(float), LENGTH, binaryFile) < LENGTH) 
    { 
     fprintf(stderr, "Problem writing some or all data to %s\n", binaryFileName); 
     return EXIT_FAILURE; 
    } 

    printf("DATA WRITTEN SUCCESSFULLY\n"); 

    if(fread(inputFloats, sizeof(float), LENGTH, binaryFile) < LENGTH) 
    { 
     fprintf(stderr, "Problem reading some or all data from %s\n\n", binaryFileName); 
     return EXIT_FAILURE; 
    } 

    for(i = 0; i < LENGTH; i++) 
    { 
     printf("float[%d] = %f\n", i, floats[i]); 
    } 

    return EXIT_SUCCESS; 
} 
+1

對於閱讀有單獨的文件位置並寫在同一個文件?如果不是fread正在嘗試閱讀那些你剛纔寫的背後的花車。在這種情況下,使用'rewind(binaryFile)'。 – LumpN 2011-04-14 13:29:05

回答

7
  • 你不和文本數據的工作,所以你應該在打開文件時指定二進制模式。使用r+b代替r+
  • 您需要fseek(binaryFile, 0, SEEK_SET)才能在寫入後「倒回」文件。 rewind也可以用於這種情況 - fseek允許您將讀/寫指針放在任何你想要的位置。
+0

非常感謝Erik。是否有任何墮落使用更簡單的調用,如下面使用@steabert - rewind(binaryFile)? – Chris 2011-04-14 13:39:48

+0

此外,我只是在玩,現在它的工作,即使使用'r +'我仍然得到相同的結果。如果將代碼移植到不同的系統,並且可能使用不同的fopen實現,並且在用'r +'打開時不接受使用二進制文件,是否將'r + b'指定爲代碼失敗? – Chris 2011-04-14 13:41:16

+1

@Chris Paynter:'rewind'在這裏完美無瑕。不過你應該知道'fseek'。 'r + b'確保沒有人擺弄嵌入的'\ n' - 它可能不需要在您的平臺上 – Erik 2011-04-14 13:46:28

1

FILE結構保留了它當前指向的文件在哪裏的記錄。由於您剛剛寫入binaryFile,因此文件指針位於您編寫內容的處。

因此,您在閱讀之前需要倒帶文件,使用fseek(binaryFile, 0, SEEK_SET);

0

當您完成寫入文件時,FILE指針位於它的末尾,所以當然如果您嘗試閱讀則無法使用。嘗試在讀取之前使用fseek將指針移至文件的開頭。

請避免這種情況:

if((binaryFile = fopen(binaryFileName, "r+")) == NULL) { 

,喜歡這樣的:

binaryFile = fopen(binaryFileName, "rb+"); 
if(!binaryFile) { 
+0

在條件清晰可讀的情況下,分配沒有任何問題。 – Erik 2011-04-14 13:30:12

+0

條件跳轉中的'='永遠不值得。比對不起更安全。 – 2011-04-14 13:32:55

1

你忘了退你的文件中讀取它之前:

rewind(binaryFile);