fread linux用法,linux下的IO详解(fopen 和 open ,fread 和 read ,fwrite 和 write)

上一篇linux下的IO 函数经常使用(一),fopen 和 open讲述了fopen和open的区别,那接下来配合使用的读写操作

linux下的IO 函数经常使用(二),fread,fwrite 和 read,write fread和fwrite 属于ANSI标准C的I/O库函数,原型如下:#include size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

size - 指定每个数据结构的长度;

nmemb - 给出要传输的记录个数。

返回值表示成功读写的字节数。

下面举一个标准C输入输出的案例吧如下: #include #include int main(void) { char readBuff[1024*2]; //通过只读方式打开一个path为readtext.c的文件,返回文件流file_read FILE* file_read = fopen("readtext.c","r"); //通过写的方式打开一个path为readtext1.c的文件,返回文件流file_write FILE* file_write = fopen("readtext1.c","w"); if(file_read && file_write) { printf("获取到file1\n"); //从file_read流中读取数据到readBuff中 int size_r = fread(readBuff,sizeof(readBuff),1,file_read); printf("读取到的数据是:\n%s\n",readBuff); //将readBuff中数据写入file_write流中 fwrite(readBuff,strlen(readBuff),1,file_write); printf("readtext1.c code :\n%s\n ",readBuff); } fclose(file_read); fclose(file_write); fprintf(stdout,"标准输出流输出:\n%s\n",readBuff); return 0; }

上述代码其实就是实现了,copy readtext.c中内容 到一个名为readtext1.c的文件中,如果readtext1.c不存在测创建该文件,并且拷贝数据,最后将拷贝的数据打印到终端。 read和write 属于GLIBC的I/O库函数,原型如下:#include ssize_t write(int fd, const void *buf, size_t count); ssize_t read(int fd, void *buf, size_t count);

fd:通过open打开的文件描述符

buf:自定义缓冲

count:一次(写入/获取)总字节

返回:

成功 返回读/写 总字节

失败 返回 -1

具体错误信息再errno这个全局变量中,通过 char *strerror(int errnum) 查看详细信息。 #include #include #include #include #include #include #include #define BUFF_SIZE (1024 * 2) int main(void) { char readBuff[BUFF_SIZE]; int fd_r = open("readtext.c",O_RDONLY|O_CREAT); int fd_w = open("readtext1.c",O_RDWR|O_TRUNC|O_CREAT); if(fd_r < 0 || fd_w < 0) { fprintf(stderr, "fopen failed, reason: %s. \nexit.\n",strerror(errno)); return -1;; } size_t read_lens = read(fd_r,readBuff,BUFF_SIZE); size_t write_lens = write(fd_w,readBuff,read_lens); fprintf(stdout,"标准输出流输出:\n%s\n",readBuff); return 0; }

俩个案例实现的结果一样都会拷贝复制的作用 俩种用法之间的区别:

在linux系统下标准C库下的I/O读写函数实际上就是对linux的系统调用 进行了一次封装 ,因为是标准C库,所以在不同的系统下调用不同的内核API,并且操作的是一个文件流

在底层IO 向内核高速页缓存读写数据之前自己多添加了一块缓冲流,

缓冲文件系统的特点是:在用户空间内存开辟一个“缓冲区”,为程序中的每个需要读写的文件使用,

当执行读操作时,优先判断是否在用户空间的“缓冲区”有所需数据,如果没有则从内核态高速页缓存中读取, 装满后再从 内存“缓冲区”依此读入接收的变量。

执行写文件的操作时, 先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。 由此可以看出,内存 “缓冲区”的大小,影响着用户态到内核态之间的切换,从而影响着程序运行的性能。

内存“缓冲区”越大,则用户态和内核态切换的次数就少,执行速度就快、效率高。

一般来说,文件“缓冲区”的大小随机器 而定。

fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等

linux系统下GLIBC库的I/O读写函数操作的是文件描述符,文件描述符是linux下的一个概念,linux下的一切设备都是以文件的形式操作.如网络套接字、硬件设备等。当然包括操作文件。

fopen是标准c函数。返回文件流而不是linux下文件句柄。只能在linux下使用该库函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值