Ошибка сегментации - невозможно записать содержимое одного файла в другой - PullRequest
0 голосов
/ 01 октября 2019

Я не могу скопировать содержимое одного файла в другой в C, потому что происходит ошибка сегментации, и я не знаю причину.

Я знаю, что это как-то связано с синтаксисомfgets или способ, которым я указываю размер буфера.

char* argument = argv[2];
char buffer[argc + 1];

FILE *fp;
FILE *quiz_log;

fp = fopen(argument, "r+");
quiz_log = fopen("quiz.log", "a");

fgets(buffer, 80, fp);
memcpy("quiz.log", buffer, 80);

fclose(quiz_log);
fclose(fp);

Ожидается: успешная запись в файл "quiz.log"

Фактически: Ошибка сегментации: 11

1 Ответ

3 голосов
/ 01 октября 2019

argc не имеет никакого отношения к размеру файла, это количество аргументов командной строки. Поэтому нет причин использовать его в качестве размера буфера.

Вместо того, чтобы пытаться читать файл сразу, использовать буфер фиксированного размера и читать файл в цикле. Используйте fread() вместо fgets(), так как он читает только одну строку.

Для записи в выходной файл необходимо использовать fwrite(), а не memcpy().

#define BUFFER_SIZE 1000
char* argument = argv[2];
char buffer[BUFFER_SIZE];

FILE *fp;
FILE *quiz_log;

fp = fopen(argument, "r");
if (fp == NULL) {
    printf("Unable to open input file\n");
    exit(1);
}
quiz_log = fopen("quiz.log", "a");
if (quiz_log == NULL) {
    printf("Unable to open quiz.log\n");
    exit(1);
}
size_t n;
while ((n = fread(buffer, 1, BUFFER_SIZE, fp)) > 0) {
    fwrite(buffer, 1, n, quiz_log);
}

fclose(quiz_log);
fclose(fp);
...