我目前有一个程序可以将文件读取为二进制文件,然后将内容保存到变量中,然后将其写回到具有相同扩展名的新文件中。我使用不同类型的文件测试了该程序,但只有一部分可以正常工作。 .txt,pdf,doc等文件无法运行,例如.exe,媒体文件(.mp4,.jpg)之类的文件。
为确保读/写程序中的错误,我打开了不能在Notepad ++中使用的文件,并将全部内容复制到了相同扩展名的新文件中。那些文件仍然不起作用。
那我想念什么?对不起,英语不好。谢谢!
编辑:
int archive(string files[], string output, int file_len) {
FILE *read_ptr, *write_ptr;
size_t result;
long file_size;
char *buffer;
char entry_text [8] = "###=###";
for(int c = 0; c < file_len; c++) {
read_ptr = fopen(files[c].c_str(), "rb");
if(read_ptr == NULL) {
cout << files[c] << " : File not found\n";
}
else {
cout << files[c] << " : File found\n";
write_ptr = fopen(output.c_str(), "ab");
fseek(read_ptr, 0, SEEK_END);
file_size = ftell(read_ptr);
rewind(read_ptr);
buffer = (char*) malloc (sizeof(char)*file_size);
result = fread(buffer, 1, file_size, read_ptr);
fprintf(write_ptr, "%s %s %d ", entry_text, files[c].c_str(), file_size);
fwrite(buffer, 1, file_size, write_ptr);
fclose(write_ptr);
}
}
return 0;
}
Edit2:固定
感谢所有帮助人员。 fprintf的尾部空格导致了该错误。在所有写入操作的开头都写入了一个空格。
答案 0 :(得分:2)
诸如可执行文件(.exe),媒体文件(.mp4,.jpg)之类的文件都有其自己的标头,其中包含要运行的必要数据,就像您基本上通过从文件中替换必要的数据来破坏这些文件那样来破坏文件原始地址,Notepad ++可能也不会复制原始二进制数据。 https://en.wikipedia.org/wiki/File_format
答案 1 :(得分:0)
没有代码很难提供帮助,但是一般的提示是检查是否以正确的模式(二进制或文本)打开文件。例如,fopen
函数具有第三个参数mode
,它讲述了模式“ http://www.cplusplus.com/reference/cstdio/fopen/