0

这是最简单的程序,但我遇到了这个错误。我将所有信息从一个文件复制到另一个文件。(坦率地说,我需要从几个文件中复制信息)

 #include <stdio.h>
 #include <string.h>

 void CopyTo(FILE *x)
 {
    FILE *f0;
    char *s=new char[100];
    f0=fopen("file0.txt","wt+");
    while(fgets(s,sizeof(s),x))
    {
        fwrite(s,1,strlen(s)+1,x);
    }
    fclose(f0);    
 };

 int main()
 {
    FILE *fi;
    fi=fopen("file1.txt","rt");
    CopyTo(fi);
    fclose(fi);
    printf("finish");
    getchar();
 }
4

2 回答 2

3

@a1ex07 解决了您当前代码的一些问题。但是,正如我在评论中所说,我认为您的代码可以通过一些更重要的更改来更有效地实现。

相信你有以下问题:

  1. 您正在堆上分配一个缓冲区并且未能释放它。
  2. 你的缓冲区很小。使用更大的缓冲区可能会更有效。
  3. fgets和,C 面向字符串的函数的使用strlen不适用于逐字节复制操作。

我会这样写:

void CopyTo(FILE *x)
{
    FILE *f0;
    char buff[16*1024];//16kB buffer, stack allocated
    size_t count;

    f0=fopen("file0.txt", "wt+");
    do
    {
        count = fread(&buff, 1, sizeof(buff), x);
        if (!ferror(x))
        {
            fwrite(&buff, 1, count, f0);
        }
    } while (count == sizeof(buff));
    fclose(f0);    
};

请注意,此功能没有错误检查。你的也没有。如果您愿意,我会留给您添加。另外,我只是在脑海中编译了这个。如果有任何故障,我相信您可以解决它们。

于 2011-11-14T20:34:12.600 回答
1

看起来您正在尝试读取和写入同一个文件 (x)。不应该 fwrite(s,1,strlen(s),f0)吗?
更新
另外 , 我 相信 应该 是 while(fgets(s,100,x)), 因为sizeof(s)返回 ( char*)的大小

于 2011-11-14T19:44:28.837 回答