使用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个字符。
有人有想法吗?
答案 0 :(得分:5)
但文件的结尾似乎过早被发现了
听起来很熟悉。
fopen(f4Path, "rb")
。这在Windows上具有重要意义。fprintf
,strcat
,fgets
等),它们会阻塞NUL
个字符。请改用fread
和fwrite
。答案 1 :(得分:1)
strcat
尝试复制以空字符结尾的char *
。这意味着,如果遇到0,它可能在这里完成,它将停止复制。
您最好使用open
read
,memcpy
和write
。
答案 2 :(得分:0)
它停止的那个字符我被复制到十六进制编辑器中,它最终成为EF BF BD,如果我没有弄错的话就是BOM。因此,将文件作为文本文件读取失败。我没有看到任何NULL字符(除非复制和粘贴摆脱它们)。
答案(已经讨论过)是不将其视为文本文件,避免str函数也不会造成任何伤害。
我要做的第一件事是添加检查字符的读取方式,这样你就会知道数据被截断的位置。现在它可以是以下任何一种:read,strcat,write。