1 题目
功能:将文件中不同位置的数据打印出来
描述:
在磁盘上也存有10个学生的数据,要求将第 1、3、5、7、9 的学生数据输入到计算机
并且在屏幕中显示出来
2 知识点
-
fseek() 函数
fseek() 函数改变文件位置标记
fseek() 的调用形式;
fseek(文件类型指针, 位移量, 起始点)
起始点用0,1或者2来替代。0 代表文件起始位置、1代表当前位置、2代表文件末尾位置"位移量"指的是一“起始点” 为基点,向前移动的字节数。位移量应是 long 型数据
fseek() 函数一般用于二进制文件。看以下例子:fseek(fp, 100L, 0) // 将文件位置标记向前移动到离文件开头100个字节处 fseek(fp, 50L, 1) // 将文件位置标记向前移动到离当前位置50个字节处 fseek(fp, -10L, 2) // 将文件位置标记向前移动到离文件末尾10个字节处
-
ftell() 函数
测定文件位置标记的当前位置
ftell() 的作用是得到流式文件中文件位置标记的当前位置
由于文件中的文件位置标记经常移动,人们往往不容易知道其当前的位置,所以常用 ftell() 函数得到当前位置,用相对于文件开头的位移量来表示。
如果调用函数时出错(例如不存在 fp 指向的文件), ftell() 返回 -1L。如下:i = ftell(fp); // i 存放文件当前的位置 if (i == -1L) { print("error!"); }
3 思路
- 按照2进制只读的方式打开指定文件,准备从文件中读取学生的成绩
- 将文件位置标记指向文件的开头,然后从磁盘文件读取一个学生的信息,并把它显示在屏幕上
- 再将文件位置标记指向第 1、3、5、7、9 的学生的数据区的开头,从磁盘中读取相应的学生的信息,显示在屏幕上
- 关闭文件
注意:将【ex046.c 用二进制方式向文件读写一组数据】按照二进制形式写入的学生信息进行读取
4 代码
#include <stdio.h>
#include <stdlib.h>
/**
功能:将文件中不同位置的数据打印出来
描述:
在磁盘上也存有10个学生的数据,要求将第 3、5、7、9 的学生数据输入到计算机
并且在屏幕中显示出来
**/
struct student_type { // 学生数据信息
char name[10];
int num;
int age;
char addr[30];
}stud[10];
int main(int argc, char const *argv[]) {
FILE * fp;
if((fp = fopen("ex046_stud.dat", "rb")) == NULL) {
printf("打开文件失败!\n");
exit(0);
}
for (int i = 0; i < 10; i+=2) {
fseek(fp, i*sizeof(struct student_type), 0); // 移动文件位置标记
fread(&stud[i], sizeof(struct student_type), 1, fp); // 读取一个数据块到结构体变量
printf("%s %4d %d %s \n", stud[i].name, stud[i].num, stud[i].age, stud[i].addr);
}
}
源文件中的数据:
"A" 1 11 "street01"
"B" 2 12 "street02"
"C" 3 13 "street03"
"D" 4 14 "street04"
"E" 5 15 "street05"
"F" 6 16 "street06"
"G" 7 17 "street07"
"H" 8 18 "street08"
"I" 9 19 "street09"
"J" 10 110 "street010"
示例结果:
"A" 1 11 "street01"
"C" 3 13 "street03"
"E" 5 15 "street05"
"G" 7 17 "street07"
"I" 9 19 "street09"