我已经编写了一个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;
}
答案 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在评论中提到的问题。
int main( void )
gets
,而是使用fgets
代替fopen
的返回值。它可以而且确实失败,例如如果输入文件不存在,或者您没有输出文件的写权限fclose
关闭文件