在磁盘上也存有10个学生的数据,要求将第 1、3、5、7、9 的学生数据输入到计算机 并且在屏幕中显示出来

71 阅读3分钟

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 <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"