2013-12-12 4 views
1

Я пытаюсь открыть exe-файл и поместить ввод, взятый у пользователя, и заменить существующие данные (переписывая их) той же длины в определенных местах. Я могу сделать это с помощью своего кода, но я вижу повреждение данных в других частях моего файла. Это мой первый раз с C++, я пробовал смотреть на все, что мог, чтобы помочь себе, но я в недоумении. Единственное, что я могу думать, это то, что он связан с символом нулевой строки в конце «char test1 [100];» (Если я правильно прочитал документацию). Но не помогает решить проблему. См связанное изображение, например с шестигранной просмотра выходных и оригинальныйC++ fwrite corruptts двоичный файл

#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 Терминатор записывается в конце моей строки (и, таким образом, влияет на работу смонтированного исполняемый файл). После немного большего чтения это мое окончательное решение, которое работает по назначению без каких-либо странных данных. Я использовал scanf («% 10s»), чтобы обеспечить использование только моей строки и избавиться от любого Null Terminator. Кто-нибудь видит в чем-то серьезное неправильное или улучшения? В конце концов, я хотел бы реализовать проверку длины строки, чтобы обеспечить правильную длину ввода пользователем. Спасибо за помощь каждого.

#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

Похоже, вы должны написать строку в exe-файл, но на самом деле вы пишете строку, заполненную значениями мусора длиной до 100 байт.

Если вы просто хотите написать строку, замените fwrite на fputs.

sizeof(array) дает выделенный размер статического массива (в данном случае 100), а не длину строки. длина строки выполняется с помощью strlen(), который не включает завершающий символ NULL.

+0

Педантичный комментарий: завершающий символ называется NUL. NULL - это указатель на нуль. – rodrigo

+0

@egur Если я знаю длину символов в строке (10 и 32 соответственно), которые будут введены и соответственно изменят значения, я все равно вижу коррупцию в тех же областях. 'code'fseek (ключ, 24523, SEEK_SET); fputs (sn, key), 'code' дает хороший результат – jhayton

0

У вас есть две проблемы.

Во-первых: вы пишете 100 байт-буферов, которые не были инициализированы, кроме как через fgets() ... все, что не помещено там fgets(), - это то, что оказалось в памяти (в стеке в этом случае).

Во-вторых: вы пишете 100 байт с каждой записью, однако ваш поиск не продвигается, по меньшей мере, до 100 байт, что означает, что вторая запись() в этом фрагменте частично перезаписывает первый.

+0

Если я изменяю буферы в соответствии с известным размером входных данных (10Char и 32Char соответственно), я все еще вижу одно и то же повреждение в тех же областях. Там не должно быть написано другое, что я намереваюсь. Неужели я просто полностью потерял этот знак? – jhayton

Смежные вопросы