在磁盘上也存有10个学生的数据,要求将第 1、3、5、7、9 的学生数据输入到计算机

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 思路

  1. 按照2进制只读的方式打开指定文件,准备从文件中读取学生的成绩
  2. 将文件位置标记指向文件的开头,然后从磁盘文件读取一个学生的信息,并把它显示在屏幕上
  3. 再将文件位置标记指向第 1、3、5、7、9 的学生的数据区的开头,从磁盘中读取相应的学生的信息,显示在屏幕上
  4. 关闭文件

注意:将【ex046.c 用二进制方式向文件读写一组数据】按照二进制形式写入的学生信息进行读取

4 代码

#include  
#include 

/**
功能:将文件中不同位置的数据打印出来
描述:
在磁盘上也存有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"

你可能感兴趣的:(算法)