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

mac2025-03-30  6

学习了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为0,则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更好。

最新回复(0)