在磁盘上也存有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 <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"
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容