fread函数和fwrite函数

本文介绍了fread和fwrite函数的基本用法及注意事项,并通过实例演示了如何使用这两个函数来读写结构体数组到文件中。

1.函数功能

  用来读写一个数据块。

2.一般调用形式

  fread(buffer,size,count,fp);

  fwrite(buffer,size,count,fp);

3.说明

  (1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。

  (2)size:要读写的字节数;

  (3)count:要进行读写多少个size字节的数据项;

  (4)fp:文件型指针。

 注意:1 完成一次写操(fwrite())作后必须关闭流(fclose());

           2 完成一次读操作(fread())后,如果没有关闭流(fclose()),则指针(FILE * fp)自动向后移动前一次读写的长度,不关闭流继续下一次读操作则接着上次的输出继续输出;

           3 fprintf() : 按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流罢了。注意的是返回值为此次操作写入到文件的字节数。如int c = fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;str1:10字节;str2: 10字节;a:2字节;b:8字节,c为33,因为写入时不同的数据间自动加入一个空格。

文件使用之后一定要关闭,否则将不能正确显示内容.fwrite:读入两个学生信息然后用fwrite存入文件

fread:用fread从文件中读出学生信息。

 

fwrite.c

#include <stdio.h>
#define SIZE 2
struct student_type
{
 char name[10];
 int num;
 int age;
 char addr[10];
}stud[SIZE];
void save()
{
 FILE *fp;
 int i;
 if((fp=fopen("stu_list","wb"))==NULL)
 {
  printf("cant open the file");
  exit(0);
 }
 for(i=0;i<SIZE;i++)
 {
   if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
    printf("file write error/n");
 }
 fclose(fp);
}
main()
{
 int i;
 for(i=0;i<SIZE;i++)
 {
   scanf("%s%d%d%s",&stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr);
   save();
 }
 for(i=0;i<SIZE;i++)
 {
   printf("%s,%d,%d",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
 }
}

 

 

fread.c

#include <stdio.h>
#define SIZE 2
struct student_type
{
 char name[10];
 int num;
 int age;
 char addr[10];
}stud[SIZE];
void read()
{
 FILE *fp;
 int i;
 if((fp=fopen("stu_list","rb"))==NULL)
 {
  printf("cant open the file");
  exit(0);
 }
 for(i=0;i<SIZE;i++)
 {
   if(fread(&stud[i],sizeof(struct student_type),1,fp)!=1)
    printf("file write error/n");
 }
 fclose(fp);
}
main()
{

 int i;
 read();
 for(i=0;i<SIZE;i++)
 {
   printf("%s,%d,%d,%s",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
   printf("/n");
 }
}

 
### 使用C语言中的`fread``fwrite`函数实现学生成绩管理系统的文件读写功能 以下是一个完整的C语言程序示例,展示如何在学生成绩管理系统中使用`fread``fwrite`函数来实现文件的读写功能。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义学生结构体 typedef struct Node { int id; // 学生编号 char name[20]; // 学生姓名 float score; // 学生成绩 } Node; // 保存学生信息到文件 void SaveToFile(Node* students, int count) { FILE* fp = fopen("students.dat", "wb"); if (fp == NULL) { printf("无法打开文件!\n"); return; } fwrite(students, sizeof(Node), count, fp); // 将学生数据写入文件[^3] fclose(fp); printf("学生信息已成功保存到文件!\n\n"); } // 从文件加载学生信息 int LoadFromFile(Node** students) { FILE* fp = fopen("students.dat", "rb"); if (fp == NULL) { printf("无法打开文件!\n"); return 0; } // 先读取文件大小以确定学生数量 fseek(fp, 0, SEEK_END); long fileSize = ftell(fp); int count = fileSize / sizeof(Node); fseek(fp, 0, SEEK_SET); *students = (Node*)malloc(count * sizeof(Node)); if (*students == NULL) { fclose(fp); printf("内存分配失败!\n"); return 0; } fread(*students, sizeof(Node), count, fp); // 从文件读取学生数据[^3] fclose(fp); printf("已成功从文件加载 %d 名学生的信息!\n\n", count); return count; } // 显示学生信息 void DisplayStudents(Node* students, int count) { for (int i = 0; i < count; i++) { printf("学生编号:%d\n", students[i].id); printf("学生姓名:%s\n", students[i].name); printf("学生成绩:%.2f\n", students[i].score); printf("-------------------------\n"); } } // 主函数 int main() { Node* students = NULL; int count = 0; int choice; while (1) { printf("---------------------------\n"); printf(" 学生成绩管理系统 \n"); printf("1. 添加学生信息\n"); printf("2. 保存学生信息到文件\n"); printf("3. 从文件加载学生信息\n"); printf("4. 显示所有学生信息\n"); printf("0. 退出系统\n"); printf("---------------------------\n"); printf("请选择操作:"); scanf("%d", &choice); switch (choice) { case 1: if (count >= 100) { // 假设最多存储100名学生 printf("学生数量已达上限!\n\n"); break; } students = (Node*)realloc(students, (count + 1) * sizeof(Node)); if (students == NULL) { printf("内存分配失败!\n"); break; } printf("请输入学生编号:"); scanf("%d", &students[count].id); printf("请输入学生姓名:"); scanf("%s", students[count].name); printf("请输入学生成绩:"); scanf("%f", &students[count].score); count++; printf("添加成功!\n\n"); break; case 2: SaveToFile(students, count); break; case 3: free(students); count = LoadFromFile(&students); break; case 4: if (count == 0) { printf("没有学生信息可显示!\n\n"); } else { DisplayStudents(students, count); } break; case 0: free(students); printf("退出系统!\n"); exit(0); default: printf("输入错误,请重新选择!\n\n"); } } return 0; } ``` 上述代码实现了学生成绩管理系统的文件读写功能。通过`fwrite`函数将学生信息保存到文件中,通过`fread`函数从文件中读取学生信息[^3]。 ### 注意事项 - 在实际开发中,建议对文件操作进行更严格的错误处理,确保程序的健壮性。 - 文件路径可以作为参数传递,以便支持不同的文件位置。 - 使用`fread``fwrite`时需要注意数据类型的匹配以及文件的打开模式[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值