2017-01-16 3 views
0

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

Ниже приведена последняя строка письма перед существующим буфером, прежде чем он в конечном итоге назовет fflush().

fprintf(_log, "-- FINAL TEXT LINE --\n"); 

Ниже приведен код, который я использую в попытке скопировать этот буфер в отдельный файл, который динамически с именем в зависимости от времени регистрации. Этот номер custom-%ld.log еще не существует и должен быть создан.

char tmp[sizeof(_log)]; 

sprintf(tmp, "custom-%ld.log", (long int)lf->time); 

FILE *fp1, *fp2; 
char a; 

fp1 = _log; 

fp2 = fopen(tmp, "a"); 
if (fp2 != NULL) { 

    do { 
     a = fgetc(fp1); 
     fputc(a, fp2); 
    } while (a != EOF); 

    fflush(fp1); 
    fclose(fp2); 
} 

fflush(_log); 

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

+0

'символ TMP [SizeOf (_log)];' не выглядит хорошо, учитывая 'FP1 = _log;' и 'FILE * fp1, * fp2; 'впоследствии. Кроме того, 'a = fgetc (fp1);' неверно для 'char a;' – EOF

+0

. Вы описали то, что вы пытаетесь достичь, но каков фактический вопрос для нас? –

ответ

1

Да, здесь есть несколько ошибок.

Это будет содержать буфер размером 4 или 8 байт в зависимости от размера слова вашего компьютера. 'sizeof' - это директива времени компиляции, которая дает вам размер базового типа.

char tmp [sizeof (_log)];

Так что это вместо того, чтобы (где 100 это просто достаточно большой номер для хранения результата):

символ TMP [100];

Следующее использование символа для 'a' не сможет удерживать значение EOF. Использовать int.

int a;

Исправление определения «a» теперь не бесконечно, но в конечном итоге оно будет записывать постоянный EOF в файл, который будет искаженным. Измените его следующим образом:

While (! (А = fgetc (FP1)) = EOF) { fputc (а, FP2); }

Таким образом, в конце концов, вы должны иметь:

char tmp[100]; 

sprintf(tmp, "custom-%ld.log", (long int)lf->time); 

FILE *fp1, *fp2; 
int a; 

fp1 = _log; 

fp2 = fopen(tmp, "a"); 
if (fp2 != NULL) { 
    while ((a = fgetc(fp1)) != EOF) { 
     fputc(a, fp2); 
    } 

    fflush(fp1); 
    fclose(fp2); 
} 

fflush(_log); 
+0

Спасибо, Майкл. Это ответ с двумя исключениями. Я закончил использование «w» внутри fopen() и удалил fflush (fp1), так как я уже смываю его, когда я сбрасываю _log. – CSmanic

+0

Прохладный, рад, что это сработало для вас. –

0

Вы пишете EOF в файл перед тем проверять его с

do { 
    a = fgetc(fp1); 
    fputc(a, fp2); 
} while (a != EOF); 

Вы можете попробовать

int a;       // make sure you have the correct type 
while((a = fgetc(fp1)) != EOF) 
    fputc(a, fp2); 
} 

EOF не является (за исключением некоторых устаревших форматов) часть файла. Это индикатор, возвращаемый функциями чтения файлов.

Замечание: fflush(fp1); - это неопределенное поведение, когда fp1 открывается для ввода.

Вы говорите "custom-%ld.log" уже не существует пока вы открываете его с

fp2 = fopen(tmp, "a"); 

Какой бы Append, если вы забыли удалить предыдущую версию. Чтобы убедиться, что это новый файл, откройте с

fp2 = fopen(tmp, "w"); 
+0

Спасибо за эти предложения. Вместо fflush (fp1) следует использовать только fclose? – CSmanic

+0

Я не знаю, почему вы пытаетесь очистить входной файл в этом фрагменте кода. Обычно это делается (другими способами), если вы хотите отказаться от ввода, который вы не можете использовать (например, неудовлетворительный ввод для 'fscanf', чтобы вы могли двигаться дальше). Но так как 'fp1 = _log;' вы пытались дважды сбросить один и тот же ввод! –

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