设为首页 加入收藏

TOP

第10章 对文件的输入输出(六)
2019-06-27 00:06:03 】 浏览:344
Tags:文件 输入 输出
anf("%s%d%d%s",stud[i].name,&stud[i].num,

&stud[i].age,stud[i].addr);

save();

return 0;

}

运行结果:

 

[例] 从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。

(为了验证在磁盘文件stu.dat中是否已存在此数据,可以用以下程序从stu.dat文件中读入数据,然后在屏幕上输出)

#include <stdio.h>

#include <stdlib.h>

#define SIZE 10

struct Student_type

{ char name[10];

int num;

int age;

char addr[15];

}stud[SIZE];

 

int main()

{ int i;

FILE *fp;

if((fp=fopen("stu.dat","rb"))==NULL) //打开输入文件stu.dat

{ printf("cannot open file\n");

exit(0);

}

for(i=0;i<SIZE;i++)

{ fread(&stud[i],sizeof(struct Student_type),1,fp); //从fp指向的文件读入一组数据

printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i]. age,stud[i].addr);

              //在屏幕上输出这组数据

}

fclose(fp);      //关闭文件stu_list

return 0;

}

运行结果:

 

[例] 从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去。

(从磁盘文件stu_list中读二进制数据,并存放在stud数组中)

##include <stdio.h>

#define SIZE 10

struct Student_type

{ char name[10];

int num;

int age;

char addr[15];

}stud[SIZE]; //定义全局结构体数组stud,包含10个学生数据

void load()

{ FILE *fp;

int i;

if((fp=fopen("stu_list","rb"))==NULL) //打开输入文件stu_list

{ printf("cannot open infile\n");

return;

}

for(i=0;i<SIZE;i++)

if(fread(&stud[i],sizeof(struct Student_type),1,fp)!=1)

//从stu_ list文件中读数据

              {      if(feof(fp))

                     {      fclose(fp);

return;

}

printf("file read error\n");

}

fclose(fp);

}

void save() //定义函数save,向文件输出SIZE个学生的数据

{ FILE *fp;

int i;

if((fp=fopen("stu.dat","wb"))==NULL) //打开输出文件stu.dat

{ printf("cannot open file\n");

return;

}

for(i=0;i<SIZE;i++)

if(fwrite(&stud[i],sizeof(struct Student_type),1,fp)!=1)

printf("file write error\n");

fclose(fp);

}

int main()

{ int i;

load();

save();

return 0;

}

总结:

(1) 数据的存储方式

   文本方式: 数据以字符方式(ASCII代码)存储到文件中。如整数12,送到文件时占2个字节,而不是4个字节。以文本方式保存的数据便于阅读

   二进制方式: 数据按在内存的存储状态原封不动地复制到文件。如整数12,送到文件时和在内存中一样占4个字节

(2) 文件的分类

   文本文件(ASCII文件):   文件中全部为ASCII字符

   二进制文件: 按二进制方式把在内存中的数据复制到文件的,称为二进制文件,即映像文件

(3) 文件的打开方式

   文本方式: 不带b的方式,读写文件时对换行符进行转换

   二进制方式: 带b的方式,读写文件时对换行符不进行转换

(4) 文件读写函数

   文本读写函数: 用来向文本文件读写字符数据的函数(如fgetc,fgets,fputc,fputs,fscanf,fprintf等)

   二进制读写函数: 用来向二进制文件读写二进制数据的函数(如getw,putw,fread,fwrite等)

 

 

10.5 随机读写数据文件

说明:

对文件进行顺序读写比较容易理解,也容易操作,但有时效率不高。而

随机访问不是按数据在文件中的物理位置次序进行读写,而是可以对任何位置上的数据进行访问,显然这种方法比顺序访问效率高得多。

10.5.1 文件位置标记及其定位

1. 文件位置标记

为了对读写进行控制,系统为每个文件设置了一个文件读写位置标记(简称文件位置标记或文件标记),用来指示“接下来要读写的下一个字符的位置”。

说明:

   一般情况下,在对字符文件进行顺序读写时,文件位置标记指向文件开头,这时如果对文件进行读/写的操作,就读/写完第1个字符后,文件位置标记顺序向后移一个位置,在下一次执行读/写操作时,就将位置标记指向的第2个字符进行读出或写入。依此类推,直到遇文件尾,,此时文件位置标记在最后一个数据之后。

如图所示:

说明:

   对流式文件既可以进行顺序读写,也可以进行随机读写。关键在于控制文件的位置标记。如果文件位置标记是按字节位置顺序移动的,就是顺序读写。如果能将文件位置标记按需要移动到任意位置,就可以实现随机读

首页 上一页 3 4 5 6 7 下一页 尾页 6/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇leadcode的Hot100系列--序 下一篇第9章 用户自己建立数据类型

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目