2012-01-08 31 views
0
int writeFile(FILE * handle, char * data, int len) 
{ 
    fseek(handle, 0, SEEK_SET); 
    for(int i=0; i <= len; i++) 
     putc(data[i], handle); 
} 

當我調用此函數,它工作正常,但如果有一個0x1A的性格上char * data它會寫無數0xFF的。這是爲什麼?putc將()寫入錯誤數據

+1

爲什麼不'fwrite(data,1,len,handle)'? – 2012-01-08 18:29:23

+0

無數的0xFF有多少?您確定計數不僅僅是您正在編寫的字符串中的0x1A(control-Z)字符之後的字符數,而是在您的代碼中給出或取消錯誤的錯誤? – 2012-01-08 18:34:43

+1

C或C++?選一個?這不是你應該在C++中使用的代碼。如果你不能算,那麼編程可能不適合你。 – 2012-01-08 18:37:22

回答

2

您正在編寫len+1字符而不是len個字符。

變化:

for(int i=0; i <= len; i++) 

到:

for(int i=0; i < len; i++) 

(請注意,這個bug在評論已經提到你前面的問題 - 請務必仔細閱讀所有你的答案和意見認真。 )

+0

Dit it。問題依然存在。我確信這是由於0x1A字符發生的,我仍然不知道爲什麼。如果我從數據中刪除了0x1a字符,那麼它工作正常 – user1091856 2012-01-08 18:30:23

+1

@ user1091856:然後刪除0x1A字符。它不應該在那裏。 – 2012-01-08 18:38:23

6

十六進制0x1A也被稱爲Control-Z。

在Windows上(當然,DOS源於它),文本文件通過在文件中嵌入control-Z來指示EOF。

如果要編寫二進制數據,請確保輸出文件作爲二進制文件打開。如果將其作爲文本文件打開,則只能輸出文本(這意味着非常有限的控制字符;可能只是選項卡和換行符,系統會照顧CRLF < - > LF映射)。

+0

太好了!這正是你所說的。我在fopen函數的mode參數上加了一個'b',並且它工作。謝謝 – user1091856 2012-01-08 18:37:13

+0

CPM發起CPM,因爲CPM沒有以字節爲單位存儲文件的大小,而是存儲在磁盤塊的數量中。最後一個塊中文件有效部分的末尾用0x1A表示。 – AProgrammer 2012-01-08 19:36:46

+0

@AProgrammer:謝謝 - 不知何故,這並不令我感到意外,但我忘記了CP/M。 – 2012-01-08 22:45:08