C编程 - 复制文件缓冲区并写入文件

时间:2017-01-16 19:58:04

标签: 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);

我确定我的错误非常基本,但我不知道自己在做什么。我已经在其他网站上尝试了几十条建议,并在其他问题上提出了建议,但我没有运气。

2 个答案:

答案 0 :(得分:1)

是的,这里有一些错误。

这将分配4或8个字节的缓冲区,具体取决于计算机的字大小。 '的sizeof'是一个编译时指令,它为您提供基础类型的大小。

  

char tmp [sizeof(_ log)];

所以这样做(其中100只是一个足够大的数字来保存结果):

  

char tmp [100];

接下来使用char来表示' a'将无法保持EOF值。使用int。

  

int a;

通过修正' a'的定义。你的循环现在不是无限的,但它最终会将常量EOF写入文件,这将是一些乱码。像这样改变:

  

while((a = fgetc(fp1))!= EOF){     fputc(a,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);

答案 1 :(得分:0)

在使用

进行检查之前,您正在将Production写入文件
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");