用c读写具有特殊字符的文件



使用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

现在是位于f5路径的文件的内容:

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

请注意,缺少4个字符。

有人有主意吗?

但是文件的末尾似乎被过早地检测到了

听起来很熟悉。

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

strcat尝试复制一个nul终止的char *。这意味着,如果它遇到一个0,它可能已经在这里完成了,它将停止复制。

您最好使用open readmemcpywrite

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

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

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

最新更新