zoukankan      html  css  js  c++  java
  • 菜鸟随笔(4)---read函数与fread函数的区别

    一只菜鸟横空出世,码农世界闯一闯,每天进展多一丢丢

    read函数与fread函数的区别

    转自:https://blog.csdn.net/qq_33832591/article/details/52268477

    (1)格式

    read: 
    ssize_t read(int fd ,void *buf, size_t count); 
    read用于从文件描述符对应的文件读取数据,调用成功返回读出的字节数;buf为读出数据的缓冲区,count为每次读取的字节数,出错返回-1,EOF返回0。 
    例如:一个文件大小600字节,每次读取400字节,则第一次读取返回400,第二次读取返回300,并且要注意如果buf为一个数组,每次读取的count最大为sizeof(buf)-1,因为字符串结尾标志为‘’,占用一个字节,否则会出现乱码。 
    fread: 
    size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream); 
    ptr为指向缓冲区保存或读取的数据。 
    size为控制记录大小。 
    nmemb为记录数。 
    函数返回读取或回写的记录数。 
    例如: 
    char buf[100]; 
    size_t temp=fread(buf,10,1,p); 
    这个语句表示,每次读取10个字节到buf里边(10×1),如果读取的字节数少于10个返回0,因此,如果想知道读取文件的具体字节数,需要将上边的语句改为: 
    size_t temp=fread(buf,10,1,p);

    (2)代码比较

    通过read和fread计算返回的字节数和显示读取的文件内容。

    #include<stdio.h>
    #include<string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include<errno.h>
    #include <unistd.h>
    int main(int arg,char *args[]){
        int num;
        if(arg<2)
            return 0;
        int fd=open(args[1],O_RDONLY);
        if(fd==-1){
            printf("%s
    ",strerror(errno));
        }
        else{
            printf("fd=%d
    ",fd);
            char buf[100];
            memset(buf,0,sizeof(buf));
            while (1) {
                int temp=read(fd,buf,sizeof(buf)-1);//注意这里
                num=num+temp;
                printf("%s",buf);
                memset(buf,0,sizeof(buf));//每次读取后清零buf
                if(temp<=0)//当文件读取结束时,退出循环
                    break;
            }
            printf("num=%d
    ",num);
    
        }
        close(fd);
    }
    

    我们首先通过 ls -l查看要读取的read.c文件的大小为688字节。

    xin@xin-Lenovo-V3000:~/code/test$ ls -l
    总用量 28
    -rw-rw-r-- 1 xin xin   175 8月  21 17:00 makefile
    -rwxrwxr-x 1 xin xin 10504 8月  21 17:49 read
    -rw-rw-r-- 1 xin xin   688 8月  21 17:49 read.c
    -rw-rw-r-- 1 xin xin  4728 8月  21 17:49 read.o
    

    然后运行make程序:

    xin@xin-Lenovo-V3000:~/code/test$ ./read read.c
    fd=3
    #include<stdio.h>
    #include<string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include<errno.h>
    #include <unistd.h>
    int main(int arg,char *args[]){
        int num;
        if(arg<2)
            return 0;
        int fd=open(args[1],O_RDONLY);
        if(fd==-1){
            printf("%s
    ",strerror(errno));
        }
        else{
            printf("fd=%d
    ",fd);
            char buf[100];
            memset(buf,0,sizeof(buf));
            while (1) {
                int temp=read(fd,buf,sizeof(buf)-1);
                num=num+temp;
                printf("%s",buf);
                memset(buf,0,sizeof(buf));
                if(temp<=0)
                    break;
            }
            printf("num=%d
    ",num);
    
        }
        close(fd);
    }
    num=688
    

    我们发现fd=3,因为每个进程启动时都打开三个文件,标准输入文件(stdin),标准输出文件(stdout),标准出错文件(stderr),这三个文件分别对应文件描述符0,1,2。因此再打开文件的话,按顺序fd=3。 
    注意:如果关闭标准输出: 
    close(STDOUT_FILENO);则1空闲,再次打开的文件描述符为1。 
    num=688与实际字节数相同。

    fread用法:

    #include<stdio.h>
    #include<string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include<errno.h>
    #include <unistd.h>
    int main(int arg,char *args[]){
        FILE *p=fopen(args[1],"r+");
        if(p==NULL){
            printf("error is %s
    ",strerror(errno));
        }
        else{
            char buf[100];
            memset(buf,0,sizeof(buf));
            size_t rc=0;
            while(1){
                size_t temp=fread(buf,1,10,p);
                rc=rc+temp;
                printf("%s",buf);
                memset(buf,0,sizeof(buf));
                if(temp==0)
                    break;
            }
            printf("rc=%d
    ",rc);
            fclose(p);
        }
    
    }

    返回688字节。结果和read的相同。

    (3)用法差异

    效率:fread为封装好的库函数,而read为系统函数,一般来说,fread效率更高。 
    读取文件差别:fread功能更强大,可以的结构体的二进制文件如果底层的操作

  • 相关阅读:
    2020~2021年第一学期《计算机科学概论》第一周学习总结
    蓝精灵小组第六周小组讨论学习总结
    2020-2021年第一学期 20202412姜和言 《网络空间安全》第六周学习总结
    蓝精灵小组第五周小组讨论学习总结
    2020-2021年第一学期 20202412姜和言 《网络空间安全》第五周学习总结
    2020-2021年第一学期 20202412姜和言 《网络空间安全》第四周学习总结
    蓝精灵小组第二周小组讨论学习总结
    2020-2021年第一学期 20202412姜和言 《网络空间安全》第三周学习总结
    蓝精灵小组第二周小组讨论学习总结
    2020-2021年第一学期 20202412姜和言 《网络空间安全》第二周学习总结
  • 原文地址:https://www.cnblogs.com/1996-1-0-3-0/p/9373926.html
Copyright © 2011-2022 走看看