从键盘输入 10 个学生的有关数据,然后把他们转存到磁盘文件中去

1 题目

函数:save() / read()

功能:用二进制方式向文件读写一组数据

描述:从键盘输入 10 个学生的有关数据,然后把他们转存到磁盘文件中去

2 知识点

在程序中不仅需要一次输入输出一个数据, 而且常常需要一次输入输出一组数据(如数组或结构体变量的值), C语言允许用fread函数从文件中读一个数据块, 用fwrite函数向文件写一个数据块。在读写时是以二进制形式进行的。向磁盘写数据时, 直接将内存中一组数据原封不动、不加转换地复制到磁盘文件上, 在读入时也是将磁盘文件中若干字节的内容一批读入内存 它们的一般调用形式为:

fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);

buffer:是一个地址

对fread来说,它是用来存放从文件读入的数据的存储区的地址

对fwrite来说,是要把此地址开始的存储区中的数据向文件输出(以上指的是起始地址)

size:要读写的字节数

count:要读写多少个数据项(每个数据项长度为size)

fp: FILE类型指针

在打开文件时指定用二进制文件, 这样就可以用 fread 和 fwrite 函数读写任何类型的信息, 例如:

fread(f, 4, 10, fp);

其中 f 是一个 float 型数组名(代表数组首元素地址)。这个函数从 fp 所指向的文件读入10个4字节的数据,存储到数组 f 中。

3 思路

定义一个有 10 个元素的结构体数据,用来存放 10 个学生的数据。

从 main() 中输入 10 个数据。

用 save() 函数实现向磁盘输出学生数据。

用 fwrite() 函数一次输出一个学生的数据

用fread() 函数进行数据的读取

  1. 在main函数中,从终端键盘输入io个学生的数据,然后调用 save 函数,将这些数据输出到以“stu.dat”命名的磁盘文件中。fwrite函数的作用是将一个长度为36节的数据块送到 ex046_stud.dat 文件中(一个struct student_type类型结构体变量的长度为它的成员长度之和,即10 + 4 + 4 + 15 = 33,实际上占36字节,是4的倍数)
  2. 在fopen函数中指定读写方式为“wb”,即二进制写方式。在向磁盘文件 ex046_stud.dat 写的时候,将内存中存放stud数组元素stud订的内存单元中的内容原样复制到磁盘文件,所建立的 ex046_stud.dat 文件是一个二进制文件。这个文件可以为其他程序所用。
  3. 在本程序中,用fopen函数打开文件时没有指定路径,只写了文件名ex046_stud.dat,系统默认其路径为当前用户所使用的子目录,在此目录下建立一个新文件ex046_stud.dat,输出的数据存放在此文件中。
  4. 程序运行时,屏幕上并无输出任何信息,只是将从键盘输入的数据送到磁盘文件上

4 代码

#include <stdio.h> 
#include <stdlib.h>
#define SIZE 10
​
/**
函数:save()/read()
功能:用二进制方式向文件读写一组数据
描述:从键盘输入 10 个学生的有关数据,然后把他们转存到磁盘文件中去
思路:
**/
​
struct Student_type {
  char name[10];
  int num;
  int age; 
  char addr[30];
}stud[SIZE];
​
// 以二进制格式进行保存
void save() {
  FILE * fp;
  if ((fp = fopen("ex046_stud.dat", "wb")) == NULL) {   // 打卡输入文件 ex046_stud.dat
    printf("写入文件打开失败!\n");
    return;
  } else {
    printf("写入成功!\n");
  }
  for (int i = 0; i < SIZE; ++i) {
    if(fwrite(&stud[i], sizeof(struct Student_type), 1, fp) != 1)
      printf("写入失败\n");
  }
  fclose(fp);
}
​
// 从二进制文件中读取数据
void read() {
  FILE * fp; 
  if ((fp = fopen("ex046_stud.dat", "rb")) == NULL) {
    printf("读取打开文件失败!\n");
    exit(0);
  }
  for (int i = 0; i < SIZE; ++i) {
    fread(&stud[i], sizeof(struct Student_type), 1, fp);  // 从 fp 指向的文件读入一组数据
    printf("%s\t%d\t%d\t%s\n", stud[i].name, stud[i].num, stud[i].age, stud[i].addr);
  }
  fclose(fp);
}
​
int main(int argc, char const *argv[]) {
  printf("输入 %d 个学生的信息:\n", SIZE);
  for (int i = 0; i < SIZE; ++i) {  // 注意 scanf 中的地址传递
    scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr);
  }
  save();
  printf("\n====== 读取写入的数据 =======\n");
  read();
  return 0;
}

示例结果:

$ gcc ex046.c -o demo
$ ./demo
输入 10 个学生的信息:
"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"
"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"
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值