Я пытаюсь открыть 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);
}
Педантичный комментарий: завершающий символ называется NUL. NULL - это указатель на нуль. – rodrigo
@egur Если я знаю длину символов в строке (10 и 32 соответственно), которые будут введены и соответственно изменят значения, я все равно вижу коррупцию в тех же областях. 'code'fseek (ключ, 24523, SEEK_SET); fputs (sn, key), 'code' дает хороший результат – jhayton