所以(只是为了好玩),我只是试图编写一个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/

10-15 17:36