fwrite(&stu, LEN, 1, fp);

时间: 2023-08-21 09:05:57 浏览: 59
`fwrite(&stu, LEN, 1, fp)` 是一个C语言标准库函数,用于将数据写入文件中。 具体解释如下: - `&stu` 是指向要写入的数据的指针,`LEN` 是每个数据块的字节数,`1` 是要写入的数据块的个数,`fp` 是文件指针。 - `fwrite` 函数会将数据块写入到文件中,并返回成功写入的数据块个数。在这个例子中,如果成功写入了一个数据块,则返回值为 `1`,否则返回值为 `0`。 因此,这段代码会将存储在 `stu` 变量中的数据写入到文件中。每个数据块的大小由 `LEN` 指定。 需要注意的是,`fwrite` 函数会按照二进制形式写入数据到文件中。如果文件不存在,则会创建一个新文件。如果文件已存在,则会在文件末尾追加写入数据。 另外,`fwrite` 函数返回值为成功写入的数据块个数。可以根据返回值来判断是否成功写入了指定数量的数据块。
相关问题

修改这段代码的错误 void in() { int i, m = 0; char ch[2]; FILE* fp; if ((fp = fopen("d:/学生系统/student.txt", "ab+")) == NULL) { printf("can not open\n"); return; } while (!feof(fp)) { if (fread(&stu[m], LEN, 1, fp) == 1) m++; } fclose(fp); if (m == 0) printf("No record!\n"); else { system("cls"); show(); } if ((fp = fopen("d:/学生系统/student.txt", "wb")) == NULL) { printf("can not open\n"); return; } for (i = 0; i < m; i++) fwrite(&stu[i], LEN, 1, fp); printf("please input(y/n):"); scanf("%s", ch); while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号:"); scanf("%d", &stu[m].num); for (i = 0; i < m; i++) if (stu[i].num == stu[m].num) { printf("学号已存在!"); _getch(); fclose(fp); return; } printf("姓名:"); scanf("%s", stu[m].name); printf("性别:"); scanf("%s", stu[m].sex); printf("出生年:"); scanf("%d", &stu[m].year); printf("出生月:"); scanf("%d", &stu[m].month); printf("出生日:"); scanf("%d", &stu[m].day); printf("c语言:"); scanf("%f", &stu[m].C); printf("高数:"); scanf("%f", &stu[m].math); printf("大学物理:"); scanf("%f", &stu[m].physics); stu[m].sum = stu[m].C + stu[m].math + stu[m].physics; stu[m].avg = stu[m].sum / 3; if (fwrite(&stu[m], LEN, 1, fp) != 1) { printf("can not save!"); _getch(); } else { printf("%s saved!\n", stu[m].name); m++; } printf("continue?(y/n):"); scanf("%s", ch); } fclose(fp); printf("OK!\n"); }

在该代码中,有一个函数 void in(),其中有一些错误。我将一些可能的错误列在下面: 1. 函数名拼写错误,应该是 void input()。 2. 在打开文件时,应该使用 "wb+" 而不是 "ab+"。因为 "ab+" 只能在文件末尾添加数据,而 "wb+" 可以覆盖文件中的内容。 3. 在读取文件时,应该使用 feof(fp) 判断文件是否结束,而不是 while (!feof(fp))。 4. 写入文件时,应该先关闭文件再重新打开,否则写入会失败。可以将写入操作放在 while 循环外面。 5. 在输入学生信息时,应该先检查该学号是否已经存在。可以用一个 for 循环遍历数组 stu,如果找到了相同的学号,就输出错误信息并直接返回。 6. 在输入学生信息时,应该给 scanf 函数添加格式控制符,否则输入错误的类型会导致程序崩溃。 下面是修改后的代码: void input() { int i, m = 0; char ch[2]; FILE* fp; if ((fp = fopen("d:/学生系统/student.txt", "wb+")) == NULL) { printf("can not open\n"); return; } while (fread(&stu[m], LEN, 1, fp) == 1) { m++; } fclose(fp); if (m == 0) { printf("No record!\n"); } else { system("cls"); show(); } if ((fp = fopen("d:/学生系统/student.txt", "wb+")) == NULL) { printf("can not open\n"); return; } for (i = 0; i < m; i++) { fwrite(&stu[i], LEN, 1, fp); } printf("please input(y/n):"); scanf("%s", ch); while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号:"); scanf("%d", &stu[m].num); for (i = 0; i < m; i++) { if (stu[i].num == stu[m].num) { printf("学号已存在!"); _getch(); fclose(fp); return; } } printf("姓名:"); scanf("%s", stu[m].name); printf("性别:"); scanf("%s", stu[m].sex); printf("出生年:"); scanf("%d", &stu[m].year); printf("出生月:"); scanf("%d", &stu[m].month); printf("出生日:"); scanf("%d", &stu[m].day); printf("c语言:"); scanf("%f", &stu[m].C); printf("高数:"); scanf("%f", &stu[m].math); printf("大学物理:"); scanf("%f", &stu[m].physics); stu[m].sum = stu[m].C + stu[m].math + stu[m].physics; stu[m].avg = stu[m].sum / 3; if (fwrite(&stu[m], LEN, 1, fp) != 1) { printf("can not save!"); _getch(); } else { printf("%s saved!\n", stu[m].name); m++; } printf("continue?(y/n):"); scanf("%s", ch); } fclose(fp); printf("OK!\n"); }

修改这段代码 void in() { int i, m = 0; char ch[2]; FILE* fp; if ((fp = fopen("d:/学生系统/student.txt", "ab+")) == NULL) { printf("can not open\n"); return; } while (!feof(fp)) { if (fread(&stu[m], LEN, 1, fp) == 1) m++; } fclose(fp); if (m == 0) printf("No record!\n"); else { system("cls"); show(); } if ((fp = fopen("d:/学生系统/student.txt", "wb")) == NULL) { printf("can not open\n"); return; } for (i = 0; i < m; i++) fwrite(&stu[i], LEN, 1, fp); printf("please input(y/n):"); scanf("%s", ch); while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号:"); scanf("%d", &stu[m].num); for (i = 0; i < m; i++) if (stu[i].num == stu[m].num) { printf("学号已存在!"); _getch(); fclose(fp); return; } printf("姓名:"); scanf("%s", stu[m].name); printf("性别:"); scanf("%s", stu[m].sex); printf("出生年:"); scanf("%d", &stu[m].year); printf("出生月:"); scanf("%d", &stu[m].month); printf("出生日:"); scanf("%d", &stu[m].day); printf("c语言:"); scanf("%f", &stu[m].C); printf("高数:"); scanf("%f", &stu[m].math); printf("大学物理:"); scanf("%f", &stu[m].physics); stu[m].sum = stu[m].C + stu[m].math + stu[m].physics; stu[m].avg = stu[m].sum / 3; if (fwrite(&stu[m], LEN, 1, fp) != 1) { printf("can not save!"); _getch(); } else { printf("%s saved!\n", stu[m].name); m++; } printf("continue?(y/n):"); scanf("%s", ch); } fclose(fp); printf("OK!\n"); }

void in() { int i, m = 0; char ch[2]; FILE* fp; if ((fp = fopen("d:/学生系统/student.txt", "ab+")) == NULL) { printf("can not open\n"); return; } while (fread(&stu[m], LEN, 1, fp) == 1) { m++; } fclose(fp); if (m == 0) { printf("No record!\n"); } else { system("cls"); show(); } if ((fp = fopen("d:/学生系统/student.txt", "ab")) == NULL) { printf("can not open\n"); return; } printf("please input(y/n):"); scanf("%s", ch); while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号:"); scanf("%d", &stu[m].num); for (i = 0; i < m; i++) { if (stu[i].num == stu[m].num) { printf("学号已存在!"); _getch(); fclose(fp); return; } } printf("姓名:"); scanf("%s", stu[m].name); printf("性别:"); scanf("%s", stu[m].sex); printf("出生年:"); scanf("%d", &stu[m].year); printf("出生月:"); scanf("%d", &stu[m].month); printf("出生日:"); scanf("%d", &stu[m].day); printf("c语言:"); scanf("%f", &stu[m].C); printf("高数:"); scanf("%f", &stu[m].math); printf("大学物理:"); scanf("%f", &stu[m].physics); stu[m].sum = stu[m].C + stu[m].math + stu[m].physics; stu[m].avg = stu[m].sum / 3; if (fwrite(&stu[m], LEN, 1, fp) != 1) { printf("can not save!"); _getch(); } else { printf("%s saved!\n", stu[m].name); m++; } printf("continue?(y/n):"); scanf("%s", ch); } fclose(fp); printf("OK!\n"); } 修改说明: 1. 删除了 while (!feof(fp)) 循环,因为这种方式会导致最后一个数据重复读入。 2. 修改了打开文件的方式,将 "wb" 修改为 "ab",这样可以在文件末尾添加数据。 3. 将读取文件和写入文件的操作分开,避免因为文件指针位置不正确而导致的错误。 4. 修改了文件指针的关闭方式,在函数的各个分支中都关闭了文件指针,避免了文件指针未关闭的风险。

相关推荐

void sort() { int i, j, m = 0; int ch; FILE *fp; struct student temp; if ((fp = fopen("C:\Users\裴浩华\Desktop\新建文件夹(1)\stu.txt", "rb")) == NULL) { printf("文件打开失败\n"); return; } while (!feof(fp)) { if (fread(&stu[m], LEN, 1, fp) == 1) { m++; } } fclose(fp); if (m == 0) { printf("文件中没有内容\n"); } printf("1:学号升序,2:英语成绩升序,3:C语言升序,4:总成绩升序,5:平均成绩升序\n"); printf("请选择显示形式:"); scanf("%d", &ch); switch (ch) { case 1: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].num > stu[j].num) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 2: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].Eng_score > stu[j].Eng_score) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 3: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].C_score > stu[j].C_score) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 4: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].total > stu[j].total) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; case 5: for (i = 0; i < m; i++) { for (j = i + 1; j < m; j++) { if (stu[i].aver > stu[j].aver) { temp = stu[i]; stu[i] = stu[j]; stu[j] = temp; } } } break; } printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n"); for (i = 0; i < m; i++) { printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t %.2f\n", stu[i].num, stu[i].name, stu[i].clas, stu[i].sex, stu[i].Eng_score, stu[i].C_score, stu[i].total, stu[i].aver); } } 画流程图

编写一个程序实现以下3个功能:(1)从文本文件导入学生的数据;(2)显示给定序号学生信息;(3)输出学生成绩表。可利用第1题定义的结构体类型(struct Student),并直接利用或修改第1题已实现的函数使其能从文件输入。如输出print和line函数可以直接利用,输出成绩表可以在print_all函数的基础上修改。 具体要求如下: (1) 先用记事本建立一个文件名为 “student.txt”文件,输入若干学生的信息,每行一个学生,各项数据用空格分隔,顺序与输入时的要求相同,保存在项目所在的文件夹下(如“图8-2”所示)。要求程序所能处理的学生数不能受程序的限制,“student.txt”文件中有多少学生的信息都可以处理。 图8-2 图8-3 (2) 在main函数中做一个功能选择菜单,可选择题目要求实现的3个功能和退出程序(如“图8-3”所示)。输入不是0-3不予响应。 (3) 导入学生信息:从“student.txt”中读取学生信息,并按二进制方式写到文件“student.dat”中。“student.txt”不存在和导入数据完成后在屏幕上输出相应的提示信息。 (4) 显示学生信息:输入一个序号,按二进制随机读的方式从“student.dat”文件中读取一个学生的信息,并在屏幕上输出;输入序号超出实际人数时给出错误提示,输入0时返回到功能菜单选择(如“图8-4”所示)。 图8-4 (5) 输出学生成绩表:按二进制方式从“student.dat”文件中顺序读取每一个学生的信息,并在屏幕上输出(如“图8-5”所示)。“student.dat”不存在时给出错误提示。

最新推荐

recommend-type

基于Python的蓝桥杯竞赛平台的设计与实现

【作品名称】:基于Python的蓝桥杯竞赛平台的设计与实现 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于Python的蓝桥杯竞赛平台的设计与实现
recommend-type

python实现基于深度学习TensorFlow框架的花朵识别项目源码.zip

python实现基于深度学习TensorFlow框架的花朵识别项目源码.zip
recommend-type

3-9.py

3-9
recommend-type

郊狼优化算法COA MATLAB源码, 应用案例为函数极值求解以及优化svm进行分类,代码注释详细,可结合自身需求进行应用

郊狼优化算法COA MATLAB源码, 应用案例为函数极值求解以及优化svm进行分类,代码注释详细,可结合自身需求进行应用
recommend-type

563563565+3859

5635356
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。