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將()寫入錯誤數據
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將()寫入錯誤數據
您正在編寫len+1
字符而不是len
個字符。
變化:
for(int i=0; i <= len; i++)
到:
for(int i=0; i < len; i++)
(請注意,這個bug在評論已經提到你前面的問題 - 請務必仔細閱讀所有你的答案和意見認真。 )
Dit it。問題依然存在。我確信這是由於0x1A字符發生的,我仍然不知道爲什麼。如果我從數據中刪除了0x1a字符,那麼它工作正常 – user1091856 2012-01-08 18:30:23
@ user1091856:然後刪除0x1A字符。它不應該在那裏。 – 2012-01-08 18:38:23
十六進制0x1A也被稱爲Control-Z。
在Windows上(當然,DOS源於它),文本文件通過在文件中嵌入control-Z來指示EOF。
如果要編寫二進制數據,請確保輸出文件作爲二進制文件打開。如果將其作爲文本文件打開,則只能輸出文本(這意味着非常有限的控制字符;可能只是選項卡和換行符,系統會照顧CRLF < - > LF映射)。
太好了!這正是你所說的。我在fopen函數的mode參數上加了一個'b',並且它工作。謝謝 – user1091856 2012-01-08 18:37:13
CPM發起CPM,因爲CPM沒有以字節爲單位存儲文件的大小,而是存儲在磁盤塊的數量中。最後一個塊中文件有效部分的末尾用0x1A表示。 – AProgrammer 2012-01-08 19:36:46
@AProgrammer:謝謝 - 不知何故,這並不令我感到意外,但我忘記了CP/M。 – 2012-01-08 22:45:08
爲什麼不'fwrite(data,1,len,handle)'? – 2012-01-08 18:29:23
無數的0xFF有多少?您確定計數不僅僅是您正在編寫的字符串中的0x1A(control-Z)字符之後的字符數,而是在您的代碼中給出或取消錯誤的錯誤? – 2012-01-08 18:34:43
C或C++?選一個?這不是你應該在C++中使用的代碼。如果你不能算,那麼編程可能不適合你。 – 2012-01-08 18:37:22