2015-02-23 45 views
0

我有這樣的結構:保存部分結構

struct DATOS{ 
    short dato1; 
    float dato2; 
}; 

DATOS dat1; 
dat1.dato1 = 123; 

FILE *archivo; 
archivo = fopen("archivo.bin","wb"); 
fwrite(&dat1,sizeof(DATOS),1,archivo); 
fclose(archivo); 

正常,但如果我想其他的值之後進入,我該怎麼辦呢?

dat1.dato2 = 4.2536;

archivo = fopen("archivo.bin","ab"); 
fwrite(&dat1.dato2,sizeof(float),1,archivo); ???? 
fclose(archivo); 

謝謝。

+5

'DATOS dat1;'是錯誤的,因爲它被正確寫入。在結構中使用'typedef'或在變量定義中使用'struct' – 2015-02-23 16:10:48

+1

用@SouravGhosh調用該點,但另一種方法是:不要使用C++編譯器來編譯C;它會允許這些事情'工作',即使它們不是有效的。C. – 2015-02-23 16:15:22

+0

您是否想要將額外的結構追加到文件中,還是隻想覆蓋文件中已有的一個結構的一部分?如果你想追加,你需要寫一個全新的結構;否則,你不知道在文件中有'short'和'float'(加上可選的填充),後面跟着一個'float',所以沒有一種好的方法來讀取數據又回來了。對於覆蓋和追加,處理整個結構要容易得多。 – 2015-02-23 16:18:13

回答

1

正如你的僞代碼所寫,第一個fwrite()會將整個結構的一個副本寫到文件中,dato2在那個時候是垃圾。

您稍後的fwrite()會將一個dato2副本附加到該文件中。因此,在該文件中它看起來像:

結構DATOS(垃圾的dato2)
浮動

如果你想用實際數據只是垃圾dato2後覆蓋,那麼你應該這樣做:

archivo = fopen("archivo.bin", "r+b"); 
fseek(archivo, (long) ((char*) &dat1.dato2 - (char*) &dat1), SEEK_SET); 
fwrite(&dat1.dato2, sizeof(dat1.dato2), 1, archivo); 
fclose(archivo); 
+0

嗯,但使用修飾符「wb」擦除整個文件,不是嗎? – 2015-02-23 17:02:42

+0

是的,對不起,我現在要解決這個問題。 – jschultz410 2015-02-23 17:09:33

+0

非常感謝您的時間和您的回答朋友;-) – 2015-02-23 17:31:44

1

是的,您的代碼會追加floatdato2的二進制表示。

當然,不需要關閉和重新打開文件,只需按順序執行兩個fwrite() s,然後關閉文件。

而且,這樣的:

fwrite(&dat1.dato2, sizeof(float), 1, archivo); 

更好寫成

fwrite(&dat1.dato2, sizeof dat1.dato2, 1, archivo); 

這使得無論是工作的dato2的類型。

請注意,存儲這樣的二進制值會使文件非常不可移植,因爲確切的內容在寫主機的計算機上有很大的不同。

+0

我想也許提問者想覆蓋文件中結構的更新部分。他需要使用'fseek()'和經常被忽略的'offsetof()'宏('#include ')來做我認爲他在做的事情。 – Persixty 2015-02-23 16:15:09

+0

好,但想象一下,這兩個片段在一個程序的不同部分。因此,應該在不同的時間開放。 – 2015-02-23 16:15:30