繁体   English   中英

C ++ fwrite破坏二进制文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM