在Linux C语言编程中往往会涉及到文件的操作,在Linux系统下,对于文件的读写非常常见,通常文件的读写涉及到直接读写和具有缓冲区的读写。
1.read,write等文件操作函数是直接读写的,即没有缓冲区的读写。其原型如下:
ssize_t read/write (int fd,void *buf,size_t count);
fd: 通过open函数打开文件返回的文件描述符
buf:指定存储器读出或写入数据的缓冲区,但是与基于缓冲区读写的概念不同
count:指定读出或写入的字节数
使用read,write的一个非常重要的问题就是如果读取的文件的长度与缓冲区buf的长度不是倍数的时候,buf会自动清除自己原来已经读取的内容么?举例来说,如果文件内容是:0123456789,buf的长度为3,那么使用read函数读取了678以后,在读取9时,buf的内容是“90/0/”还是“978”呢?
一个演示的例子如下所示:
#include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <fcntl.h> int main() { int fd=open("/code/temp.txt",O_CREAT|O_RDWR,0666); char buf[3]; int i=0; int size; while((size=read(fd,buf,3))>0) { for(i=0;i<3;i++) { printf("%c",buf[i]); } } close(fd); return 0; }
从显示的结果来看,read在每次向buf缓冲区中写入数据时,是先清除buf中原有的数据以后在写入的。即上面的例子中buf最后的数据应该是“90/0/”.
同理,对于基于缓冲区读写的fread和fwrite在读取到最后几个数据时同样会上面的问题,那么这时fread和fwrite会自动清除buf原来的内容么?
一个测试程序如下:
#include <stdlib.h> #include <stdio.h> int main() { FILE *fp=fopen("/code/temp.txt","r+b"); char buf[3]; int i=0; int size; while((size=fread(buf,sizeof(char),3,fp))>0) { for(i=0;i<3;i++) { printf("%c",buf[i]); } } fclose(fp); return 0; }
通过结果我们同样可以获知:fread,fwrite如上面的read和write一样同样会先清除原来的内容,然后在把这些数据写入buf。