10.12 标准IO

news2024/11/24 4:10:28

练习:针对fscanf和fprintf练习

有如下结构体:

typedef struct Student

{

char name[20];

int id;

float chinese;//语文成绩

float math;

float english;

float physical;

float chemical;

float biological; }stu_t; *Pstu_t//声明学生结构体类型

在栈区静态开辟空间或堆区动态开辟空间,用于接收学生信息

编写2个.c文件,save.c 和 load.c save.c负责: 使用fprintf将3个学生的所有信息保存到文件中去 load.c负责: 使用fscanf读取文件中的3个学生的信息,将读取到的数据,保存到另一个开辟的空间中去,并输出空间中的内容 最终实现效果: 运行save.c,会将准备的学生信息写入文件中 运行load.c,会将文件中的所有学生信息输出到终端上

代码实现: 

#include <myhead.h>
#define MAX 3
typedef struct Student{//定义一个学生信息的结构体
	char name[20];
	int id;
	double chinese;
	double math;
	double english;
	double physical;
	double chemical;
	double biological;
}stu_t,*Pstu_t;
void input_stu(Pstu_t p){//在终端向p指向的空间输入学生信息
	int i;
	for(i=0;i<MAX;i++){//终端输入学生信息
		printf("请输入第%d个学生信息:",i+1);
		scanf("%s%d%lf%lf%lf%lf%lf%lf",(p+i)->name,&(p+i)->id,&(p+i)->chinese,
				&(p+i)->math,&(p+i)->english,&(p+i)->physical,&(p+i)->chemical,&(p+i)->biological);
	}
}
void save_stu(const char *file,Pstu_t p){//将p指向的学生信息内容保存到文件中
	FILE *fp=fopen(file,"w");
	if(NULL==fp){
		perror("文件打开失败");
		return;
	}
	int i;
	for(i=0;i<MAX;i++){
		fprintf(fp,"%s %d %.2lf %.2lf %.2lf %.2lf %.2lf %.2lf\n",(p+i)->name,(p+i)->id,(p+i)->chinese,
				(p+i)->math,(p+i)->english,(p+i)->physical,(p+i)->chemical,(p+i)->biological);
	}
	fclose(fp);
}
void load_stu(const char *file,Pstu_t p){//将文件中学生信息读取到p指向的空间中,并终端打印学生信息
	FILE *fp=fopen(file,"r");
	if(NULL==fp){
		perror("文件打开失败");
		return;
	}
	int i=0;
	while(1){//将文件中学生信息读取到p指向的空间中
		int res=fscanf(fp,"%s%d%lf%lf%lf%lf%lf%lf",(p+i)->name,&(p+i)->id,&(p+i)->chinese,
				&(p+i)->math,&(p+i)->english,&(p+i)->physical,&(p+i)->chemical,&(p+i)->biological);
		//对于%s%d%lf遇到与自己类型不匹配的情况时,读取结束,并且光标保持在下一个位置,对于空格和换行是结束,同时,光标位于空格或换行后一个字符
		//%c是所有字符都吸收,包括空格和换行
		if(EOF==res){
			break;
		}
		i++;
	}
	fclose(fp);
	for(i=0;i<MAX;i++){//终端打印学生信息
		printf("第%d个学生信息:\n姓名:%s\n学号:%d\n语文:%.2lf\n数学:%.2lf\n英语:%.2lf\n物理:%.2lf\n化学:%.2lf\n生物:%.2lf\n",i+1,
				(p+i)->name,(p+i)->id,(p+i)->chinese,(p+i)->math,(p+i)->english,(p+i)->physical,
				(p+i)->chemical,(p+i)->biological);
	}

}
int main(int argc, const char *argv[])
{
	//使用动态内存开辟空间实现
	Pstu_t p=(Pstu_t)malloc(sizeof(stu_t)*MAX);
	if(NULL==p){
		perror("空间开辟失败");
		return 1;
	}
	input_stu(p);
	save_stu(argv[1],p);
	Pstu_t ps=(Pstu_t)malloc(sizeof(stu_t)*MAX);
	if(NULL==ps){
		perror("空间开辟失败");
		return 1;
	}
	load_stu(argv[1],ps);
	free(p);
	p=NULL;
	free(ps);
	ps=NULL;
	return 0;
}

有如下结构体:

typedef struct Student

{

char name[20];

int id;

float chinese;//语文成绩

float math;

float english;

float physical;

float chemical;

float biological; }stu_t; *Pstu_t//声明学生结构体类型

创建链表,用于接收学生信息和传递学生信息

编写2个.c文件,save.c 和 load.c save.c负责: 使用fprintf将3个学生的所有信息保存到文件中去 load.c负责: 使用fscanf读取文件中的3个学生的信息,将读取到的数据,保存到另一个开辟的空间中去,并输出空间中的内容 最终实现效果: 运行save.c,会将准备的学生信息写入文件中 运行load.c,会将文件中的所有学生信息输出到终端上

代码实现 :

#include <myhead.h>
#define MAX 3
typedef struct Student{//定义一个学生信息的结构体
	char name[20];
	int id;
	double chinese;
	double math;
	double english;
	double physical;
	double chemical;
	double biological;
}stu_t,*Pstu_t;
typedef struct stu{//定义单链表结构体
	union{
		int len;
		stu_t data;
	};
	struct stu *next;
}Link,*Plink;
Plink create(){//开辟头节点
	Plink p=(Plink)malloc(sizeof(Link));
	if(NULL==p){
		perror("空间开辟失败");
		return NULL;
	}
	p->len=0;
	p->next=NULL;
	return p;
}
void input_stu(Pstu_t p){//在终端向p指向的学生结构体空间输入学生信息
	printf("请输入学生信息:");
	scanf("%s%d%lf%lf%lf%lf%lf%lf",p->name,&p->id,&p->chinese,
			&p->math,&p->english,&p->physical,&p->chemical,&p->biological);
}
int insert_tail(Plink L,stu_t data){//采用尾插法插入学生信息
	Plink p=(Plink)malloc(sizeof(Link));
	if(NULL==p){
		perror("空间开辟失败");
		return 1;	
	}
	p->data=data;
	Plink t=L;
	while(t->next!=NULL){
		t=t->next;
	}
	p->next=t->next;
	t->next=p;
	L->len++;
	return 0;
}
void save_stu(const char *file,Plink p){//将p指向的学生信息内容保存到文件中
	FILE *fp=fopen(file,"w");
	if(NULL==fp){
		perror("文件打开失败");
		return;
	}
	Plink t=p->next;
	while(t!=NULL){
 		fprintf(fp,"%s %d %.2lf %.2lf %.2lf %.2lf %.2lf %.2lf\n",t->data.name,t->data.id,t->data.chinese,
				t->data.math,t->data.english,t->data.physical,t->data.chemical,t->data.biological);
		t=t->next;
	}
	fclose(fp);
}
void load_stu(const char *file,Plink p){//将文件中学生信息读取到p指向的空间中,并终端打印学生信息
	FILE *fp=fopen(file,"r");
	if(NULL==fp){
		perror("文件打开失败");
	}
	while(1){//将文件中学生信息读取到p指向的空间中
		stu_t data;
		int res=fscanf(fp,"%s%d%lf%lf%lf%lf%lf%lf",data.name,&data.id,&data.chinese,
				&data.math,&data.english,&data.physical,&data.chemical,&data.biological);
		//对于%s%d%lf遇到与自己类型不匹配的情况时,读取结束,并且光标保持在下一个位置,对于空格和换行是结束,同时,光标位于空格或换行后一个字符
		//%c是所有字符都吸收,包括空格和换行
		if(EOF==res){
			break;
		}
		insert_tail(p,data);//插入新节点,存储数据
	}
	fclose(fp);
	Plink t=p->next;
	while(t!=NULL){//终端打印学生信息
		printf("学生信息:\n姓名:%s\n学号:%d\n语文:%.2lf\n数学:%.2lf\n英语:%.2lf\n物理:%.2lf\n化学:%.2lf\n生物:%.2lf\n",
				t->data.name,t->data.id,t->data.chinese,t->data.math,t->data.english,t->data.physical,
				t->data.chemical,t->data.biological);
		t=t->next;
	}

}
//空间释放
void free(Plink p){
	Plink t=p;
	while(t!=NULL){
		t=t->next;
		free(p);
		p=t;
	}
}
int main(int argc, const char *argv[])
{
	//创建单链表实现
	Plink L=create();
	int i;
	for(i=0;i<MAX;i++){
		stu_t data;
		input_stu(&data);
		insert_tail(L,data);
	}
	save_stu(argv[1],L);
	//创建新表头
	Plink K=create();
	load_stu(argv[1],K);
	free(L);
	free(K);
	return 0;
}

结果: 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2207939.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逆向思维的力量:Prolog在游戏编程中的应用与代码实践

在主流游戏开发语言如C++、Python和Unity统治的今天,Prolog作为一种基于逻辑编程的语言,似乎与游戏开发不太沾边。然而,Prolog的逻辑推理机制和简洁的语法在解决复杂逻辑问题上有着独特的优势,尤其是在人工智能(AI)决策和路径规划等领域。通过Prolog,我们可以以极简的代…

【C++】C++的引用

一.引用 1.引用的概念和定义 引用不是新定义⼀个变量&#xff0c;而是给已存在变量取了⼀个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同⼀块内存空间。 类型& 引用别名 引用对象; 2.引用的特征 a.引用在定义时必须初始化 …

从数据到结论:ChatGPT如何帮助你完成复杂的数据分析?

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 在撰写学术论文时&#xff0c;数据分析往往是最具挑战性的部分之一。无论是定量研究还是定性研究&#xff0c;如何有效分析数据、得出合理结论都是关键所在。 ChatGPT的优势 1. 快速处理大量数据 在面对大…

Qt-窗口对话框QColorDialog的使用(52)

目录 描述 常用方法 使用 描述 颜⾊对话框的功能是允许⽤⼾选择颜⾊。继承⾃ QDialog 类。颜⾊对话框如下图⽰&#xff1a; 常用方法 1、QColorDialog (QWidget *parent nullptr) //创建对象的同时设置⽗对象 2、QColorDialog(const QColor &initial, QWidget *paren…

2024开放原子开源生态大会 | 麒麟信安携手openEuler共建开源生态,共塑产业未来

9月25日-27日&#xff0c;由开放原子开源基金会主办的2024开放原子开源生态大会在北京开幕&#xff0c;大会以“开源赋能产业&#xff0c;生态共筑未来”为主题。工业和信息化部党组书记、部长金壮龙&#xff0c;北京市委副书记、市长殷勇&#xff0c;工业和信息化部总经济师、…

Chromium HTML Tags与c++接口对应关系分析

一、HTML 标签(HTML Tags) <a> <head> <img>等等这些标签在c中的接口是如何定义和查找的呢&#xff1f; 更多标签参考&#xff1a; HTML <a> target 属性 (w3school.com.cn) 二、html_tag_names.json5 (third_party\blink\renderer\core\html\htm…

QD1-P10 HTML 超链接标签(a)下篇

本节学习&#xff1a;HTML a 标签实现大纲跳转&#xff08;锚点&#xff09;。 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p10 本节实现大纲&#xff08;锚点&#xff09;跳转 ​​ 完整 HTML 代码 <!DOCTYPE html> <html><head><meta charset&…

python爬虫--某动漫信息采集

python爬虫--tx动漫 一、采集主页信息二、采集详情页信息三、代码供参考一、采集主页信息 略。 二、采集详情页信息 如上图所示,使用xpath提取详情页的标题、作者、评分、人气、评论人数等数据。 三、代码供参考 import csv import time import random import requests fr…

弧光保护装置的应用

长期以来&#xff0c;人们对中低压母线的保护一直不够重视&#xff0c;没有保护来快速切除配电站所内部发生的故障&#xff0c;往往使故障发展扩大造成开关设备被严重烧毁&#xff0c;有的甚至发展成“火烧连营”的事故。同时&#xff0c;变电站的变压器由于遭受外部短路电流冲…

【harmonyOS开发笔记3】ArkTS中数组的使用

数组的定义 数组&#xff1a;是一个容器&#xff0c;可以存储多个数据 定义数组的格式&#xff1a; let 数组名: 类型[] [数据1&#xff0c; 数据2&#xff0c; ] 示例&#xff1a;let names: string[] [小明, 小红] // 数组 let 数组名: 类型[] [数据1, 数据2, ] let …

【大模型实战教程】Qwen2.5 PyTorch模型微调入门实战

1 引言 Qwen2.5是Qwen大型语言模型系列的最新成果。对于Qwen2.5&#xff0c;通义千问团队发布了从0.5到720亿参数不等的基础语言模型及指令调优语言模型。Qwen2.5相比Qwen2带来了以下改进&#xff1a; 显著增加知识量&#xff0c;在编程与数学领域的能力得到极大提升&#xf…

四种Agent落地方案:Coze、AutoGen、Langchain、llama-index

前言 1. Coze 优势&#xff1a; 模块化设计&#xff1a; 允许开发者灵活地添加或替换组件&#xff0c;适应不同的应用需求。 易于集成&#xff1a; 支持与多种外部系统和服务的集成&#xff0c;方便与现有业务系统对接。 用户友好&#xff1a; 提供图形化界面和命令行工具&…

讯飞与腾讯云:Android 语音识别服务对比选择

目录 一、讯飞语音识别 1.1 讯飞语音识别介绍 1.1.1 功能特点 1.1.2 优势 1.2 接入流程 1.2.1 注册账号并创建应用 1.2.2 下载SDK等相关资料 1.2.3 导入SDK 1.2.4 添加用户权限 1.2.5 初始化讯飞SDK 1.2.6 初始化语音识别对象 1.2.7 显示结果 二、腾讯云语音识别 …

数字人直播带货操作详解,必看!

作为人工智能和直播带货两大热门行业的结合体&#xff0c;数字人直播带货一经出现就引发了众多商家的关注&#xff0c;许多创业者更是因此对数字人直播这一创业项目产生了浓厚的兴趣&#xff0c;连带着对数字人直播带货怎么操作等问题的讨论也日渐热烈了起来。 本期&#xff0…

给图片加文字的软件有哪些?这几种图片编辑文字软件简单好用

一张优秀的图片往往能瞬间抓住人们的眼球&#xff0c;无论是自媒体运营、广告设计还是日常生活分享&#xff0c;给图片添加文字都是提升视觉效果的重要手段。很多小伙伴不清楚该怎样给图片添加上精美的文字&#xff0c;下面给大家分享几种好用编辑文字的方法&#xff0c;一起来…

双语大脑的神经可塑性能力:来自健康和病理个体的见解

摘要 双语经验的神经印记对于理解大脑如何处理优势语言和非优势语言至关重要&#xff0c;但关于它的研究仍然没有定论。不同的研究表明神经处理存在相似性或差异性&#xff0c;这对患有脑肿瘤的双语患者具有重要意义。保留术后的双语功能需要考虑到术前的神经可塑性变化。在这…

【原创】可用于 Android Studio 的翻译插件

在不少讲解Android 开发的老师视频中会出现一个运行在Android Studio 上的翻译插件&#xff0c;感觉挺实用的。 接下来&#xff0c;我们把它安装在我们的Android Studio 上。 设置 点击右上角齿轮按钮&#xff0c;选择Settings 安装 翻译插件 输入Tanslation&#xff0c;选…

jmeter出参保存到文件,保存失败解决

1、添加JSON提取 2、添加beanshell FileWriter writer new FileWriter("C:/Users/xxx/Desktop/signUrl.csv", true); writer.write(vars.get("company_name")"\t"vars.get("signUrl")"\n"); writer.close(); 写文件的两个…

金融大数据平台总体技术

目录 金融大数据平台应用场景风险管理 场景描述解决方案​​​​​​​市场营销 ​​​​​​​场景描述解决方案​​​​​​​金融大数据信息价值链​​​​​​​金融大数据平台总体目标金融大数据平台功能技术要求​​​​​​​ ​​​​​​​概述数据接入功能要求 ​​…

鹦鸣app——服务端项目搭建

文章目录 服务端项目搭建创建启动程序构建全局初始化工厂函数创建app应用对象基于shell脚本启动项目加载项目配置数据库初始化SQLAlchemy初始化Redis数据库初始化mongoDB数据库初始化 日志初始化日志的等级flask日志功能的基本使用构建日志模块 蓝图初始化自动注册蓝图注册蓝图…