所以(只是为了好玩),我只是试图编写一个C代码来复制文件。我四处阅读,似乎从流中读取的所有函数都调用fgetc()
(我希望这是真的吗?),所以我使用了该函数:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define FILEr "img1.png"
#define FILEw "img2.png"
main()
{
clock_t start,diff;
int msec;
FILE *fr,*fw;
fr=fopen(FILEr,"r");
fw=fopen(FILEw,"w");
start=clock();
while((!feof(fr)))
fputc(fgetc(fr),fw);
diff=clock()-start;
msec=diff*1000/CLOCKS_PER_SEC;
printf("Time taken %d seconds %d milliseconds\n", msec/1000, msec%1000);
fclose(fr);
fclose(fw);
}
在2.10Ghz core2Duo T6500 Dell inspiron笔记本电脑上,this文件的运行时间为140毫秒。
但是,当我尝试使用
fread
/fwrite
时,由于我不断增加每次调用传输的字节数(即以下代码中的st
变量),直到达到10ms左右的峰值时,运行时间减少了!这是代码:#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define FILEr "img1.png"
#define FILEw "img2.png"
main()
{
clock_t start,diff;
// number of bytes copied at each step
size_t st=10000;
int msec;
FILE *fr,*fw;
// placeholder for value that is read
char *x;
x=malloc(st);
fr=fopen(FILEr,"r");
fw=fopen(FILEw,"w");
start=clock();
while(!feof(fr))
{
fread(x,1,st,fr);
fwrite(x,1,st,fw);
}
diff=clock()-start;
msec=diff*1000/CLOCKS_PER_SEC;
printf("Time taken %d seconds %d milliseconds\n", msec/1000, msec%1000);
fclose(fr);
fclose(fw);
free(x);
}
为什么会这样呢?即如果
fread
实际上是对fgetc
的多次调用,那么为什么速度差呢?编辑:指定“增加字节数”引用第二个代码中的变量
st
最佳答案
fread()
没有调用fgetc()
来读取每个字节。
它的行为就像重复调用fgetc()
一样,但是它可以直接访问fgetc()
读取的缓冲区,因此可以直接复制大量数据。
关于c - C中fgetc/fputc和fread/fwrite之间的速度比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8250889/