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

在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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值