上一篇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下使用该库函数