2012-01-04 118 views
1

使用C語言,我試圖操作由openssl生成的一些文件,其中包含許多(非常)特殊字符。但文件的結尾似乎過早地被檢測到。 例如看到我的程序的提取物,那是應該的文件複製到另一個:在c中使用特殊字符讀取和寫入文件

(爲簡便起見,我不顯示文件的開放的考驗,但我這樣做,我的程序)

char msgcrypt[FFILE]; 
FILE* fMsg = fopen(f4Path,"r"); 
while(fgets(tmp,FFILE,fMsg) != NULL) strcat(msgcrypt,tmp); 
fclose(fMsg); 
FILE* fMsg2 = fopen(f5Path,"w"); 
fprintf(fMsg2,"%s",msgcrypt); 
fclose(fMsg2); 

這裏是位於f4Path文件的內容:

Salted__X¢~xÁïÈú™xe^„fl¯�˜<åD 

現在位於f5Path文件的內容:

Salted__X¢~xÁïÈú™xe^„fl¯ 

請注意,缺少4個字符。

有人有想法嗎?

+0

考慮使用fopen(f4path,「rb」)和fread()讀取非可打印字符,否則稱爲二進制字符。 – Jack 2012-01-04 21:10:37

回答

4

但文件的結尾似乎過早檢測

聽起來很耳熟。

  • 打開文件時使用fopen(f4Path, "rb")。這在Windows上有真正的意義。
  • 不要使用字符串函數(fprintf,strcat,fgets等)他們會窒息NUL字符。改爲使用freadfwrite
+0

謝謝!你是否認爲當我使用函數寫入和讀取某個套接字時,我會遇到同樣的問題? – ruckpositiv 2012-01-04 22:18:39

+0

我問,因爲我使用這些函數通過套接字進行通信時遇到同樣的問題,但我不確定問題出在那裏 – ruckpositiv 2012-01-04 22:30:04

+0

現在我的問題似乎已被修復。謝謝。 – ruckpositiv 2012-01-05 15:34:14

0

strcat嘗試並複製nul結尾的char *。這意味着,如果它遇到0,它可能已經在這裏完成,它將停止複製。

您最好使用openread,memcpywrite

+0

您不能在'FILE *'上使用讀取和寫入,因此您必須使用'open'而不是'fopen'來打開文件。 – cha0site 2012-01-04 21:09:55

+0

是的,確實的,固定的。 – fge 2012-01-04 21:14:00

0

它停止的字符我複製到一個十六進制編輯器,它最終成爲EF BF BD,如果我沒有弄錯,它是一個BOM。因此,將該文件作爲文本文件讀取失敗。我沒有看到任何NULL字符(除非複製和粘貼擺脫它們)。

答案(正如已經討論過的)不把它當作文本文件來處理,並且避免str函數也不會造成任何傷害。

我要做的第一件事是添加一個檢查字符是如何被讀取的,這樣你就會知道數據被截斷的地方。現在它可以是以下任何一種:read,strcat,write。