低级文件操作实例代码

 #include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>


#define FILE_TXT "sf.txt"
#define FILE_BIN "sf.bin"

typedef struct student
{
 int id;
 char name[16];
 double score;
}student;

int main(void)
{
 int fd_txt, fd_bin;
 int i, result, len;
 long offset = 0;
 student stu_txt[3], stu_bin[3];
 char buf[64];
  
 //打开二进制文件进行读
 fd_bin = open(FILE_BIN, O_RDONLY);
 if(fd_bin<0)
 {//文件打开失败
  perror("open");
  exit(-1);
 }
 
 memset(stu_bin, 0, sizeof stu_bin); //清空数据
 for(i=0; i<sizeof(stu_bin)/sizeof(stu_bin[0]); i++)
 {
  result = read(fd_bin, &stu_bin[i], sizeof(stu_bin[i]));
  if(result != sizeof(stu_bin[i]))
  {
   printf("read error.");
   break;
  }
 }
 printf("binary file read result:\n");
 for(i=0; i<sizeof(stu_bin)/sizeof(stu_bin[0]); i++)
 {
  printf("%d %s %f\n",
   stu_bin[i].id,
   stu_bin[i].name,
   stu_bin[i].score);
 }
 close(fd_bin);
 
 //打开文本文件进行读
 fd_txt = open(FILE_TXT, O_RDONLY);
 if( fd_txt < 0)
 {//文件打开失败
  perror("open");
  exit(-1);
 }
 memset(stu_txt, 0, sizeof(stu_txt));
 offset = 0;
 for(i=0; i<sizeof(stu_txt)/sizeof(stu_txt[0]); i++)
 {
  char * p;
  memset(buf, 0, sizeof(buf));
  result = pread(fd_txt, buf, sizeof(buf), offset);      //类似于read 和 write,只是读写不是从文件 当前位置开始,而是从 offset 位置开始,并且函数执行完也不影响当前文件指针位
     置,即指针位置不改变
  if(result <= 0)
   break;
  sscanf(buf, "%d %s %lf",
     &stu_txt[i].id,
      stu_txt[i].name,
     &stu_txt[i].score);
  
  p = strstr(buf, "\n");
  if(p)
   *p = 0;
  offset += strlen(buf) + 1;
 }
 printf("text file read result:\n");
 for(i=0; i<sizeof(stu_txt)/sizeof(stu_txt[0]); i++)
 {
  printf("%d %s %f\n",
   stu_txt[i].id,
   stu_txt[i].name,
   stu_txt[i].score);
 }
 close(fd_txt);
 
 return 0;
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值