您的位置:首页 > 运维架构 > Linux

Linux C中read/write,fread/fwrite等的使用说明!

2011-10-11 22:22 531 查看
在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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux c fp 编程 语言 file