c语言fwrite写入中文linux,linux下c语言中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#include#include#include#include#includeint 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更好。

原文链接:https://blog.csdn.net/tangya3158613488/article/details/102853398

你可能感兴趣的:(c语言fwrite写入中文linux,linux下c语言中fread和fwrite的区别)