Microsoft Visual Studio C运行时库在filecopy.exe中检测到致命错误

时间:2011-11-14 19:37:59

标签: c visual-studio crt

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

 #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();
 }

2 个答案:

答案 0 :(得分:3)

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

我相信你有以下问题:

  1. 您正在堆上分配缓冲区并且无法释放它。
  2. 你的缓冲区很小。使用更大的缓冲区可能更有效。
  3. 使用fgetsstrlen,面向C字符串的函数不适用于逐字节复制操作。
  4. 我会这样写:

    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);    
    };
    

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

答案 1 :(得分:1)

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