#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;
}