Так что этот код работает сам по себе, но когда я использую его со своей основной программой, он как-то подтягивает какие-то, казалось бы, совершенно не связанные части кода и записывает их в файл, который я пишу... Все компилируется без проблемы, поэтому я знаю, что это не проблема определения или проблема указателя, и все остальное записывается правильно, но каким-то образом я получаю более 3200 байтов материала, к которому структура не имеет никакого отношения, и записываю его по адресу 0x1 в файл, который также не является частью структуры...
struct a {
unsigned long addr; //File address
int sz; //Num Bytes
unsigned long pos; // Buffer Address
};
// Many more than this, but you get the general struct idea..
struct a as[][3] = {
{{ 0xF245, 5, 0x6F02C4 }},
{{ 0x471D, 128, 0x65892 }},
{{ 0x6198F, 12, 0xA4092 }}
}
//Failing code
fdin = fopen(files[FIRSTFILE]->filename, "rb");
fdout = fopen(files[SECONDFILE]->filename, "r+b");
if (!fdin) {
fprintf(stderr, "Unable to open %s\n", files[FIRSTFILE]->filename);
fclose(fdin);
cleanup(ONSCREEN);
return EXIT_FAILURE;
}
if (!fdout) {
fprintf(stderr, "Unable to open %s\n", files[SECONDFILE]->filename);
fclose(fdout);
fclose(fdin);
cleanup(ONSCREEN);
return EXIT_FAILURE;
}
У меня здесь есть другой код, но ни один из них не читает из файла и не записывает в другой, как этот. Но где-то здесь он неправильно записывает как минимум 3200 байтов в диапазоне адресов 0x1-0xC88 в файле и извлекает данные, которые я использую в функциях popen перед всем этим.
for (int i = 0; i <= (sizeof(buffer) / sizeof(buffer[0])); i++) {
memset(buffer, 0, sizeof(buffer));
fseek(fdin, as[i]->pos, SEEK_SET);
fread(buffer, 1, as[i]->sz, fdin);
fseek(fdout, as[i]->addr, SEEK_SET);
fwrite(buffer, 1, as[i]->sz, fdout);
}
if(fclose(fdout)==EOF || fclose(fdin)==EOF) {
logit(ONSCREEN, "Error closing files.\n\n");
cleanup(ONSCREEN);
return EXIT_FAILURE;
}
fflush(fdin);
fflush(fdout);
Вот фрагмент кода из основной программы, из которой каким-то образом она извлекает информацию:
sleep(1);
memset(command, 0x00, 256);
sprintf(command, "./somecommand");
fp = popen(command, "r");
if (fp == NULL) {
logit(ONSCREEN, "popen failed.");
cleanup(ONSCREEN);
return EXIT_FAILURE;
}
while(fgets(store, sizeof(store), fp)) {
if (strstr(store, "Expected Output")) {
break;
}
}
pclose(fp);
fflush(fp);
Опять же, все эти функции прекрасно работают сами по себе, но когда они объединены в одну функцию, они плохо работают вместе... Файлы (ФАЙЛ *fp, *fdin, *fdout) имеют разные имена, а хранилище массив символов называется иначе, чем буфер. Что я здесь сделал не так?
Кажется, что-то небезопасное в использовании popen и fopen в одной и той же функции, или что-то, что я не убираю здесь должным образом ...?
buffer
? Я надеюсь, что это массив, а не указатель. - person Michael Burr   schedule 10.03.2013fdout
, использованиеfclose(fdout)
в пути ошибки приведет к сбоям. Аналогично дляfdin
. Это не ваша непосредственная проблема; это потенциальная проблема в ваших путях ошибок. Вы не проверяете свои звонкиfread()
иfwrite()
; это беспокоит (особенноfread()
). - person Jonathan Leffler   schedule 10.03.2013<
вместо<=
в этом:for (int i = 0; i <= (sizeof(buffer) / sizeof(buffer[0])); i++)
- person Michael Burr   schedule 10.03.2013as
, из которого вы получаете позицию файла и размеры ввода-вывода? Это похоже на ошибку, даже если массивas[]
имеет то же количество элементов, что иbuffer[]
в данный момент. - person Michael Burr   schedule 10.03.2013