2013-12-11 59 views
0

下面的代碼給出瞭如下的dat文件中有趣的輸出。我期望0和輸出0.0。將結構對象寫入文件時,文件擴展名是否很重要?

         ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ             ÌÌÌÌ     

此外,當我創建一個txt文件,而不是一個dat文件輸出變爲

NULL NULL NULL NULL ...

爲什麼它很重要,如果我給一個不同的擴展文件?另外爲什麼我不能得到正常的0,而是我和NULL?

#include <stdio.h> 

struct clientData{ 

int accountNo; 
char firstName[20]; 
char lastName[20]; 
double balance; 

}; 

int main(void){ 

int i; 
FILE *ptrCrdFile; 
struct clientData bankClient={0,"","",0.0}; 

ptrCrdFile=fopen("credits.dat","wb"); 

for (i = 0; i < 100; i++) 
{ 
    fwrite(&bankClient, sizeof(struct clientData), 1, ptrCrdFile); 
} 

fclose(ptrCrdFile); 

return 0; 

} 
+0

什麼是您使用DAT和txt文件的應用程序? – doptimusprime

+0

通常無法以可預測的方式序列化化合物類型。分別序列化每個字段。或者嘗試將結構更改爲'{double,int,char [20],char [20]}'。 –

+0

我使用NotePad ++ – Lyrk

回答

1

如果您想用文本編輯器打開保存的文件(.txt或.dat,擴展名無關緊要),則需要使用文本輸出函數(如fprintf)寫入文件。

例如:

... 
for (i = 0; i < 100; i++) 
{ 
    fprintf(ptrCrdFile, "%d\t%s\t%s\t%lf\n", bankClient.accountNo, 
      bankClient.firstName, bankClient.lastName, bankClient.balance); 
} 
... 
3

文件擴展名只是名稱的一部分,對用戶來說很方便。取決於操作系統,它可能被用來識別使用哪個應用程序來打開它,但這是不可靠的。所以在很多情況下,程序都有代碼來檢測真實格式,所以他們不需要單獨依賴擴展。即許多電影播放器​​可以打開正確播放的所有類型的電影文件,而不管擴展名是否改變。例如,如果您將電影從mpg4重命名爲avi ..

1

它取決於操作系統和應用程序。通常,擴展名是用於快速識別文件類型的文件名的一部分。某些應用程序使用擴展名作爲標記以快速確定文件類型。

2

文件擴展名是用來幫助操作系統識別它的數據格式,但它不修改其代表性。由於您是按原樣編寫的,因此請使用十六進制編輯器查看您的文件以查找數據。

     "b" option for file output format : 

隨着文件上面的模式說明符是作爲文本文件打開。爲了將文件作爲二進制文件打開,模式字符串中必須包含「b」字符。這個附加的「b」字符可以附加在字符串的末尾(從而製作以下複合模式:「rb」,「wb」,「ab」,「r + b」,「w + b」,「a + b「),或插入混合模式(」rb +「,」wb +「,」ab +「)的字母和」+「號之間。

例如,struct clientData bankClient={5,"a","b",0.1};提供以下數據:

(X86。平臺;小端排序)

enter image description here

      data representation : 
  • 5 - >0x05 0x00 0x00 0x00在小端
  • char[20]="a" - >0x61 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  • char[20]="b" - >0x62 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
  • 0.1(64位) - >0000 0000 9a99 9999 9999 b93f(看[雙浮點表示])