在c中读取和写入带有特殊字符的文件

时间:2012-01-04 21:00:56

标签: c file character

使用C语言,我试图操纵openssl生成的一些文件并包含很多(非常)特殊字符。但文件的结尾似乎过早被发现。 例如,查看我的程序的摘录,该程序应该将文件复制到另一个文件:

(为简单起见,我没有显示文件打开的测试,但我在我的程序中这样做)

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个字符。

有人有想法吗?

3 个答案:

答案 0 :(得分:5)

  

但文件的结尾似乎过早被发现了

听起来很熟悉。

  • 打开文件时使用fopen(f4Path, "rb")。这在Windows上具有重要意义。
  • 不要使用字符串函数(fprintfstrcatfgets等),它们会阻塞NUL个字符。请改用freadfwrite

答案 1 :(得分:1)

strcat尝试复制以空字符结尾的char *。这意味着,如果遇到0,它可能在这里完成,它将停止复制。

您最好使用open readmemcpywrite

答案 2 :(得分:0)

它停止的那个字符我被复制到十六进制编辑器中,它最终成为EF BF BD,如果我没有弄错的话就是BOM。因此,将文件作为文本文件读取失败。我没有看到任何NULL字符(除非复制和粘贴摆脱它们)。

答案(已经讨论过)是不将其视为文本文件,避免str函数也不会造成任何伤害。

我要做的第一件事是添加检查字符的读取方式,这样你就会知道数据被截断的位置。现在它可以是以下任何一种:read,strcat,write。