[英]C++ fwrite corrupts binary file
我正在尝试打开一个exe文件,并将从用户那里获取的输入放到特定位置,并替换相同长度的现有数据(覆盖它)。 我可以使用代码来完成此操作,但是在文件的其他部分看到数据损坏。 这是我第一次使用C ++,我尝试着研究可以帮助自己的一切,但我很茫然。 我唯一能想到的是,它与'char test1 [100];'结尾的空字符串char有关。 (如果我没看错文档的话)。 但是对解决问题没有帮助。 例如,从输出的十六进制查看器和原始图像中查看链接的图像
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *key;
key=fopen ("Testfile.exe","r+b");
char test1[100];
char test2[100];
printf("Test data to input:");
fgets(test1, sizeof test1, stdin);
printf("Second test data to input:");
fgets(test2, sizeof test2, stdin);
fseek (key,24523,SEEK_SET); //file offset location to begin write
fwrite (test1,1,sizeof(test1),key);
fseek (key,24582,SEEK_SET); //file offset location to begin write
fwrite (test2,1,sizeof(test2),key);
fseek (key,24889,SEEK_SET); //file offset location to begin write
fwrite (test2,1,sizeof(test2),key);
fclose(key);
printf ("Finished");
return(0);
}
进行最初的编辑后,我仍在与在字符串末尾写入Null终止符进行斗争(因此影响了已编辑的exe文件的操作)。 经过更多阅读之后,这是我最终的解决方案,可以按预期工作,而无需写入任何奇怪的数据。 我使用scanf(“%10s”)来确保仅使用我的字符串并摆脱任何Null终止符。 有人在这里看到任何重大错误或有待改进之处吗? 最终,我想实现字符串长度检查,以确保用户输入了正确的长度。 感谢大家的帮助。
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *key;
key=fopen ("test.exe","r+b");
char test1[10];
char test2[32];
printf("Input Test1 data:");
scanf ("%10s",test1); //only read 10 Chars
printf("Input test2 data:");
scanf ("%32s",test2); //only read 32 Chars
fseek (key,24523,SEEK_SET); //file offset location to begin write
fputs (test1,key);
fseek (key,24582,SEEK_SET); //file offset location to begin write
fputs (test2,key);
fseek (key,24889,SEEK_SET); //file offset location to begin write
fputs (test2,key);
fclose(key);
printf ("Finished");
return(0);
}
看来您要在exe文件中写入一个字符串,但实际上您是在编写一个用垃圾值填充的字符串,最大长度为100个字节。
如果只想编写字符串,则将fwrite
替换为fputs
。
sizeof(array)
给出静态数组的分配大小(在这种情况下为100),而不是字符串长度。 字符串长度是通过strlen()
完成的,其中不包含终止NULL字符。
你有两个问题。
第一:你写这尚未初始化除了通过100点字节的缓冲区fgets()
......一切都没有摆在那里通过fgets()
是无论发生在在内存(堆栈在这种情况下)。
第二:您每次写入都要写入100字节,但是您的寻道之后至少不能前进到100字节,这意味着此代码段中的第二个write()会部分覆盖第一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.