37. 标准IO


前面我们使用所有的输入输出都是无缓冲的系统IO, 那么能不能用标准IO来代替系统IO呢?
可能有人回想问为什么要代替系统IO呢? 先来看一个例子就知道原因了.


复制文件

这里我使用系统IO和标准IO来复制一个比较大的文件来说明原因. 这里实验的文件大小是200M左右

在这里插入图片描述

系统IO :

完整代码 : stdcpy.c

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>

#define BUF_SIZE 50

int main(int argc, char *argv[]){
    int readfd, writefd;
    int len;
    char buf[BUF_SIZE];
    clock_t start, end;

    readfd = open(argv[1], O_RDONLY);
    writefd = open("txt", O_WRONLY | O_CREAT, 0755);

    start = clock();
    
    while((len = read(readfd, buf, sizeof(buf))) > 0)
		write(writefd, buf, len);

    end = clock();
    printf("%f seconds\n", (double)(end - start) / CLOCKS_PER_SEC);

    close(readfd);
    close(writefd); 

    return 0;
}

运行程序 :

./sys txt.txt

运行了大概4秒. 接下来我们看一下标准IO.
在这里插入图片描述


标准IO :

完整代码 : syscpy.c

#include <stdio.h>
#include <unistd.h>
#include <time.h>

#define BUF_SIZE 50

int main(int argc, char *argv[]){
    FILE *readfp, *writefp;
    char buf[BUF_SIZE];
    clock_t start, end;

    readfp = fopen(argv[1], "r");
    writefp = fopen("txt", "w+");

    start = clock();

    while(fgets(buf, sizeof(buf), readfp) != NULL)
	fputs(buf, writefp);

    end = clock();
    printf("%f seconds\n", (double)(end - start) / CLOCKS_PER_SEC);

    fclose(readfp);
    fclose(writefp);

    return 0;
}

运行程序 :

./std txt.txt

在这里插入图片描述


小结

可以明显看出来标准IO的执行时间更短, 虽然可以通过调整数组的大小来减小运行时间, 但不可否认标准IO效率更高. 同样, 如果将标准IO运用在套接字中是不是传输效率也会大幅度提升呢? 这个我们下节再来说明

时间计算参考 : 程序运行时间计算

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值