read函数和write函数以及和fread、fwrite函数的区别

学习了write函数和read函数时总把里面的参数弄混,今天特地写这篇博客将这两个函数的各个参数弄明白。同时还要明白read和fread的区别,write和fwrite的区别。

write函数

函数原型ssize_t write(int fd,const void* buf,size_t count);

函数说明:write()会把参数buf所指向的内存写入count个字节放到参数所指向的文件里。如果成功写入会返回实际写入的字节数,当有错误发生时则返回-1,错误代码存放在error中。

参数解释

  • fd:是文件描述符,write所对应的是写,即就是1号文件描述符(对应标准输出)
  • buf:通常是一个字符串,需要写入的字符串
  • count:每次写入的字节数

说明:write函数返回值一般无0,只有当如下情况发生时才会返回0:write(fd,p1+len,(strlen(p1)-len))中第三个参数为0,此时write函数说明也不做,只返回0.write函数从buf写数据到fd中,若buf中数据无法一次性读完,那么第二次读buf中的数据时,其读指针位置,即第二个参数buf不会自动移动,需要程序员编程控制。但并不是简单的将buf首地址填入第二个参数,可以按如下格式实现读位置移动:write(fd,p1+len,(strlen(p1)-len)),这样write第二次循环时就会从p1+len处写数据到fd,后面以此类推,直至strlen(p1)-len的值变为0.

read函数

函数说明:read函数会把参数fd所指的文件传送count个字节到buf指针所指的内存中。返回值为实际读取到的字节数,如果返回0表示已经到达文件末尾或是无可读取的数据。若参数count为,则read函数不会有作用并返回0.

函数原型ssize_t read(int fd ,void *buf, size_t count);

参数解释

  • fd:是文件描述符
  • buf:为读出数据的缓冲区
  • count:为每次读取的字节数(是请求读取的字节数,读上来的数据保 存在缓冲区buf中,同时文件的当前读写位置向后移)

注意:read函数参数中fd所指向的文件中的数据如果小于要读取的数据就会引起阻塞。

写一个例子说明write函数和read函数的用法:

   #include<stdio.h>
   #include<sys/stat.h>
   #include<sys/types.h>
   #include<fcntl.h>
   #include<string.h>
   #include<unistd.h>
   
   int main()
   {
     umask(0);
    int fd = open("myfile",O_WRONLY|O_CREAT,0644);
    if(fd < 0)
     {
         perror("open");
         return 1;
     }
     const char *msg = "hello world";
     write(fd,msg,strlen(msg));//将msg指针指向的内容写进fd文件描述符所对应的文件中,即写进myfile中
     char buf[1024];
     ssize_t s = read(fd,buf,strlen(msg)); //将fd所指向的文件中的内容读进buf所指向的内存中                                         
     if(s > 0)
     {
         printf("%s",buf);
    }
    return 0;
}



fread和fwrite函数

size_t fread(void *buf, size_t size, size_t count, FILE *fp);

size_t fwrite(const void * buf, size_t size, size_t count, FILE *fp);

  • ptr为指向缓冲区保存或读取的数据。
  • size为控制记录大小。
  • nmemb为记录数。
  • 函数返回读取或回写的记录数。

即 fread 函数从文件 fp 中读出“size*count”个字节保存到 buf 中,而 fwrite 把 buf 中的“size*count”个字节写到文件 fp 中。最后,函数 fread 和 fwrite 的返回值为读或写的记录数,成功时返回的记录数等于 count 参数,出错或读到文件末尾时返回的记录数小于 count,也可能返回 0。需要注意的是,尽管 fread 和 fwrite 函数可以对数据进行成块读写,但并不是说一次想读写多少数据就能全部读写多少数据,毕竟缓存有限,而且不同的操作系统的缓存大小也可能不一样。

用法差异

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

发布了119 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tangya3158613488/article/details/102853398