C ++ fwrite破坏了二进制文件

时间:2013-12-12 20:59:30

标签: c++ fwrite

我正在尝试打开一个exe文件并放置来自用户的输入并替换在特定位置具有相同长度的现有数据(覆盖它)。我可以用我的代码执行此操作,但我看到文件的其他部分中的数据损坏。这是我第一次使用C ++,我已经尝试过尽我所能来帮助自己,但我很茫然。我唯一能想到的是它与'char test1 [100];'末尾的空字符串char有关。 (如果我正确阅读文档)。但是没有帮助我解决问题的问题。请参阅链接图像,例如来自Hex Viewer of Output和Original

    #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 Terminator(因此影响编辑的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);
    }

2 个答案:

答案 0 :(得分:2)

看起来你要在exe文件中写一个字符串,但实际上你正在编写一个填充垃圾值的字符串,最长可达100个字节。

如果您只想写字符串,请将fwrite替换为fputs

sizeof(array)给出静态数组的分配大小(本例中为100),而不是字符串长度。字符串长度通过strlen()完成,不包括终止NULL字符。

答案 1 :(得分:0)

你有两个问题。

首先:你正在编写100字节的缓冲区,除了通过fgets()之外还没有被初始化... fgets()没有放入的所有东西都是在内存中发生的事情(在堆栈中)这种情况)。

第二:你在每次写入时写入100个字节但是你的搜索没有提前到至少100个字节,这意味着这个片段中的第二个write()会部分覆盖第一个。