news 2026/5/8 10:17:39

实验四【文件操作】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
实验四【文件操作】

物联1251

xcjie

题目一:数据持久化——增加与保存1

任务:使⽤ fprintf 函数将数组内容持久化存储到名为 farms.txt 的⽂本⽂件中。
⽂件操作重点:使⽤ “w” 模式打开⽂件,掌握 fprintf 的格式化写⼊。
要求:每⾏存储⼀个产地的信息,字段间⽤空格分隔。

#include <stdio.h> #include <stdlib.h> typedef struct{ int id; char name[50]; int yield; }OrangeFarm; int main(){ OrangeFarm new_farm; FILE*fp; printf("---廉江红橙产地数据追加---\n"); printf("请输入新增产地信息(格式:ID 名称 产量):\n"); if(scanf("%d%s%d",&new_farm.id,new_farm.name,&new_farm.yield)!=3){ printf("输入格式错误。\n"); return 1; } fp=fopen("farms.txt","a"); if(fp==NULL){ printf("错误:无法打开文件进行追加!\n"); return 1; } fprintf(fp,"%d%s%d\n",new_farm.id,new_farm.name,new_farm.yield); fclose(fp); printf("\n新纪录已成功追加至farms.txt末尾。\n"); return 0; }

题⽬ 2:数据过滤——读取与删除
【任务】:先将 farms.txt 中的所有数据加载到结构体数组中。⽤户输⼊⼀个要删除的“产地ID”,程序在数组中剔除该条⽬后,将剩余数据重新覆盖写⼊ farms.txt 。
⽂件操作重点:使⽤ “r” 模式读取, feof() 或 fscanf() != EOF 判断⽂件结尾。
删除逻辑:在内存(数组)中完成删除,再通过重新打开⽂件并写⼊来实现“物理删除”。

#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ int id; char name[50]; int yield; }OrangeFarm; int main(){ OrangeFarm farms[100]; int count=0; int deleted; char confirm; FILE*fp; fp=fopen("farms.txt","r"); if(fp==NULL){ printf("错误:无法打开farms.txt,请确保文件已存在。\n"); return 1; } while(fscanf(fp,"%d%s%d",&farms[count].id,farms[count].name,&farms[count].yield)==3){ count++; } fclose(fp); if(count==0){ printf("数据库为空,无数据可删除。\n"); return 0; } printf("\n--- 当前廉江红橙产地列表 ---\n"); for (int i = 0; i < count; i++) { printf("[%d] %-12s", farms[i].id, farms[i].name); if ((i + 1) % 3 == 0) { printf("\n"); } } printf("\n---------------------------\n"); printf("请输?要删除的产地 ID: "); scanf("%d", &deleted); int targetIndex = -1; for (int i = 0; i < count; i++) { if (farms[i].id == deleted) { targetIndex = i; break; } } if (targetIndex == -1) { printf("错误:未找到 ID 为 %d 的记录。\n", deleted); return 0; } printf("\n拟删除记录详情:\n"); printf("ID: %d | 名称: %s | 产量: %d 吨\n", farms[targetIndex].id, farms[targetIndex].name, farms[targetIndex].yield); printf("警告:此操作不可撤回!确定删除吗?(y/n): "); getchar(); scanf("%c", &confirm); if (confirm != 'y' && confirm != 'Y') { printf("操作已安全取消。\n"); return 0; } for (int i = targetIndex; i < count - 1; i++) { farms[i] = farms[i + 1]; } count--; fp = fopen("farms.txt", "w"); if (fp == NULL) { printf("系统错误:?法更新?件数据。\n"); return 1; } for (int i = 0; i < count; i++) { fprintf(fp, "%d %s %d\n", farms[i].id, farms[i].name, farms[i].yield); } fclose(fp); printf("成功:ID 为 %d 的记录已从系统中彻底移除。\n", deleted); return 0; }

题⽬ 3:精准更新——加载与修改
【任务】:实现交互式修改。

程序打开⽂件并加载所有 ID 供⽤户预览。
⽤户输⼊⽬标 ID。
程序提⽰⽤户选择修改项(1.修改名称 2.修改产量)。
⽤户输⼊新值后,程序更新数组并同步回⽂件。
⽂件操作重点:掌握“内存加载 -> 修改 -> 重新回写”的完整链路。
要求:利⽤ switch-case 结构处理⽤户的修改选择。

#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { int id; char name[50]; int yield; } OrangeFarm; int main() { OrangeFarm farms[100]; int count = 0; int targetId, choice; FILE *fp; fp = fopen("farms.txt", "r"); if (fp == NULL) { printf("错误:非法打开 farms.txt,请确保文件已存在。\n"); return 1; } while (fscanf(fp, "%d %s %d", &farms[count].id, farms[count].name, &farms[count].yield) == 3) { count++; } fclose(fp); if (count == 0) { printf("数据库为空,请先添加数据。\n"); return 0; } printf("--- 当前系统内的产地 ID 列表 ---\n"); for (int i = 0; i < count; i++) { printf("[%d] %-12s", farms[i].id, farms[i].name); if ((i + 1) % 3 == 0) { printf("\n"); } } printf("\n-------------------------------\n"); printf("请输入您想要修改的产地 ID: "); scanf("%d", &targetId); int index = -1; for (int i = 0; i < count; i++) { if (farms[i].id == targetId) { index = i; break; } } if (index == -1) { printf("未找到 ID 为 %d 的记录。\n", targetId); return 0; } printf("\n已锁定产地: %s (产量: %d 吨)\n", farms[index].name, farms[index].yield); printf("1. 修改产地名称\n"); printf("2. 修改预计产量\n"); printf("3. 取消修改\n"); printf("请选择操作 (1-3): "); scanf("%d", &choice); switch (choice) { case 1: printf("请输入新的名称: "); scanf("%s", farms[index].name); break; case 2: printf("请输入新的产量 (吨): "); scanf("%d", &farms[index].yield); break; case 3: printf("操作已取消。\n"); return 0; default: printf("非法输入,操作终止。\n"); return 0; } fp = fopen("farms.txt", "w"); if (fp == NULL) { printf("回写文件失败!\n"); return 1; } for (int i = 0; i < count; i++) { fprintf(fp, "%d %s %d\n", farms[i].id, farms[i].name, farms[i].yield); } fclose(fp); printf("ID 为 %d 的记录已成功更新。\n", targetId); return 0; }

题⽬ 4:条件检索——读取与查询

【任务】:编写⼀个查询⼯具。⽤户输⼊⼀个“产量阈值”,程序打开⽂件读取数据,通过遍历结构体数组,筛选并打印出所有产量⼤于该阈值的产地信息。
⽂件操作重点:使⽤循环配合 fscanf 逐⾏解析数据。
逻辑重点:考查结构体成员的访问与逻辑判断表达式。

#include <stdio.h> #include <stdlib.h> typedef struct { int id; char name[50]; int yield; } OrangeFarm; int main() { FILE *fp; OrangeFarm temp; int threshold; int foundCount = 0; fp = fopen("farms.txt", "r"); if (fp == NULL) { printf("错误:无法打开数据文件 farms.txt,请确保文件已存在。\n"); return 1; } printf("----------- 廉江红橙产量筛选系统 -----------\n"); printf("请输入产量阈值(吨):"); if (scanf("%d", &threshold) != 1) { printf("输入无效。\n"); fclose(fp); return 1; } printf("\n正在查询产量大于 %d 吨的产地...\n", threshold); printf("-------------------------------------------\n"); printf("%-10s %-20s %-10s\n", "ID", "产地名称", "预计产量(吨)"); printf("-------------------------------------------\n"); while (fscanf(fp, "%d %s %d", &temp.id, temp.name, &temp.yield) == 3) { if (temp.yield > threshold) { printf("%-10d %-20s %-10d\n", temp.id, temp.name, temp.yield); foundCount++; } } if (foundCount == 0) { printf("未找到产量超过 %d 吨的记录。\n", threshold); } else { printf("-------------------------------------------\n"); printf("查询完毕,共找到 %d 条记录。\n", foundCount); } fclose(fp); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 11:49:23

GitHub项目运营:如何通过开源示例引流至付费服务

GitHub项目运营&#xff1a;如何通过开源示例引流至付费服务 在AI模型部署的实战中&#xff0c;一个训练得再完美的神经网络&#xff0c;若无法在生产环境中快速响应请求&#xff0c;其价值就会大打折扣。想象一下&#xff0c;你的图像分类服务在测试集上准确率高达98%&#xf…

作者头像 李华
网站建设 2026/4/25 18:43:47

猎奇智能冲刺港股:上半年营收2.5亿净利6889万 拟募资9亿

雷递网 雷建平 12月27日苏州猎奇智能设备股份有限公司&#xff08;简称&#xff1a;“猎奇智能”&#xff09;日前递交招股书&#xff0c;准备在深交所创业板上市。猎奇智能计划募资9.1亿元&#xff0c;其中&#xff0c;5.82亿元用于高端智能装备制造建设项目&#xff0c;2.51亿…

作者头像 李华
网站建设 2026/4/28 15:43:17

社交媒体敏感词过滤:高吞吐量文本处理的TensorRT方案

社交媒体敏感词过滤&#xff1a;高吞吐量文本处理的TensorRT方案 在某头部社交平台的一次流量高峰中&#xff0c;系统每秒需处理超过8万条用户评论。这些内容必须在50毫秒内完成敏感词识别——否则发帖延迟将肉眼可见&#xff0c;用户体验急剧下滑。更严峻的是&#xff0c;若漏…

作者头像 李华
网站建设 2026/4/23 14:32:14

STM32单片机开发首选:Keil uVision5下载操作指南

STM32开发从零开始&#xff1a;Keil uVision5 安装与下载配置实战全解析 你是不是也经历过这样的场景&#xff1f; 手里的STM32最小系统板接好线&#xff0c;ST-Link插上电脑&#xff0c;满怀期待地打开Keil准备烧录程序——结果弹出“ No target connected ”或“ Cannot…

作者头像 李华
网站建设 2026/5/7 9:13:16

城市大脑交通调度:TensorRT支撑的实时预测模型集群

城市大脑交通调度&#xff1a;TensorRT支撑的实时预测模型集群 在城市主干道的高峰期&#xff0c;一个路口的信号灯若能提前30秒感知到即将形成的拥堵并动态调整配时方案&#xff0c;整条道路的通行效率可能提升20%以上。这样的场景不再是科幻&#xff0c;而是“城市大脑”正在…

作者头像 李华