C程序文件副本

时间:2016-05-22 17:31:07

标签: c

我已经编写了一个C代码,用于将文件数据从一个文件复制到另一个。以下代码工作正常。但编译器仍然显示错误的答案,因为执行时间高达280.0,下面是我的代码< / p>

#include<stdio.h>
int main()
{
    FILE *fp1,*fp2;
    char ch,fname1[20],fname2[20];
    printf("Enter the input file name\n");
    gets(fname1);
    printf("Enter the output file name\n");
    gets(fname2);
    fp1=fopen(fname1,"r");
    fp2=fopen(fname2,"w");
    do
    {
        ch=fgetc(fp1);
        fputc(ch,fp2);
    }
    while(ch!=EOF);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您的程序将始终输出EOF字符。

fgetc实际上并没有返回一个字符,而是一个int。 EOF实际上是-1。写入时,会将额外字节(0xFF)写入输出文件。

正确的代码如下:

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

你可以争辩这个代码的优雅,但关键是你应该打印EOF角色。

答案 1 :(得分:1)

我建议使用fread读取输入文件的重要块(至少4096字节,甚至多达1MB),然后使用fwrite将该块写入输出文件。这有助于减少旋转硬盘上seek time and rotational latency上浪费的时间。

这样的事情:

size_t n;
size_t bufsize = 1024 * 1024;         // one megabyte buffer size
void *buffer = malloc( bufsize );   
if ( buffer != NULL ) {
    while ( (n = fread( buffer, 1, bufsize, fp1 )) != 0 ) {
        fwrite( buffer, 1, n, fp2 );
    }
}

当然,你应该解决@WeatherVane在评论中提到的问题。

  • main应声明为int main( void )
  • 从不使用gets,而是使用fgets代替
  • 始终检查fopen的返回值。它可以而且确实失败,例如如果输入文件不存在,或者您没有输出文件的写权限
  • 确保在完成文件时使用fclose关闭文件