前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >那些年我们一起忘掉的C (十七).文件读写结构体

那些年我们一起忘掉的C (十七).文件读写结构体

原创
作者头像
franket
发布2021-10-18 10:19:15
2230
发布2021-10-18 10:19:15
举报
文章被收录于专栏:技术杂记

前言

结构体是复杂数据结构的基础,文件是在外存中保存数据的常用方式


概要


文件读写的基础操作

将16题第3步的结果写入文件

代码语言:javascript
复制
struct stu s[5];

fp=fopen("st.txt","w+");

fwrite(s,sizeof(struct stu),5,fp);

fclose(fp);

代码注解

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#define LENGTH 20 //定义一个宏用于批量修改字符型数组大小
#define SIZE 5  //定义一个宏用于批量修改结构体数组大小

void main()
{
	struct stu //定义一个结构体
	{
		int stuid; //包含一个ID属性
		char name[LENGTH]; //包含一个名字属性
		int score; //包含一个分数属性
	} s2[SIZE],s[SIZE]={
			{11,"xiaoming",78},
			{13,"jingjing",88},
			{16,"vivian",98},
			{19,"tony",60},
			{90,"duno",59} }; //创建一个学生结构体数组,并且为这五个学生赋初值
	int i,j,tmpid,tmpscore; //定义几个整型变量,i,j用来进行循环控制,tmpid和tmpscore进行临时值存放
	char tmps[LENGTH]; //进行字符串的临时存放
	FILE *fp, *fpr; //定义两个文件指针用于对文件的操作

/*	printf("please input totle %d students info:\n\n",SIZE); //从终端循环读入SIZE个学生的信息,并且保存到前面定义的结构体数组中
	for (i=0;i<SIZE;i++)
	{
		printf("please input the %d student id:\n",i+1);
		scanf("%d",&s[i].stuid); //结构体中属性的正确引用方法,通过.来引用
		printf("please input the %d student name:(less then %d length)\n",i+1,LENGTH);
		scanf("%s",&s[i].name); 
		printf("please input the %d student score:(int type)\n",i+1);
		scanf("%d",&s[i].score);
	}     
*/
	printf("\nThe totle %d students info are:\n%10s%20s%10s\n",SIZE,"stuid","name","score"); //使用格式化输出可以让信息以更友好的方式展示
	for (i=0;i<SIZE;i++) printf("%10d%20s%10d\n",s[i].stuid,s[i].name,s[i].score); //使用格式化输出可以让信息以更友好的方式展示

	for (i=0;i<SIZE-1;i++) //使用冒泡排序的思想基于分数进行排序
	{
		for(j=i+1;j<SIZE;j++) 
		{
			if(s[i].score < s[j].score) 
			{
				tmpid=s[i].stuid;
				s[i].stuid=s[j].stuid;
				s[j].stuid=tmpid;
	
				strcpy(tmps,s[i].name);
				strcpy(s[i].name,s[j].name);
				strcpy(s[j].name,tmps);
	
				tmpscore=s[i].score;
				s[i].score=s[j].score;
				s[j].score=tmpscore;
			}
		}
	}

	if((fp=fopen("st.txt","w+"))==NULL) //尝试进行一次对文件st.txt的读写操作然后将文件指针赋给fp,如果失败,就打印出错信息,并且将main函数跳出
	{
		printf("cannot open file\n");
		return;
	}

	for(i=0;i<SIZE;i++)
	{
		if(fwrite(&s[i],sizeof(struct stu),1,fp)!=1) //将结构体内容作为一条记录写入到文件指针fp所指示的文件中,如果反馈值不为1就代表写入操作失败,然后弹出信息并且跳出主函数 
		{
			printf("file write error\n"); 
			return;
		}
	}
	fclose(fp); //使用完后,关闭文件,可以确保缓存中的信息写入到了磁盘
	
	if((fpr=fopen("st.txt","r"))==NULL) //尝试进行一次对文件st.txt的读操作然后将文件指针赋给fpr,如果失败,就打印出错信息,并且将main函数跳出
	{
		printf("cannot open file\n");
		return;
	}
	for(i=0;i<SIZE;i++)	
	{
		if(fread(&s2[i],sizeof(struct stu),1,fpr)!=1) //将一条长度为sizeof(struct stu)的记录从指针fpr所指示的文件中作为结构体内容读入到s2结构体数组元素中,如果反馈值不为1就代表写入操作失败,然后弹出信息并且跳出主函数 
		{
			printf("file read error\n");
			return;
		} 
	}
	fclose(fpr); //使用完后,关闭文件

	printf("\nAll student sort resault base on score in file are:\n%10s%20s%10s\n","stuid","name","score");
	for (i=0;i<SIZE;i++) printf("%10d%20s%10d\n",s2[i].stuid,s2[i].name,s2[i].score); //将结构体数组s2中的内容逐条打印出来

}

思路

思路比较简单和直接,主要是在巩固结构体的定义,属性的调用,基于其中部分属性值的排序,还有文件的读写方法

基础知识点

  • 结构体的定义与创建
  • 结构体的赋值
  • 结构体属性的用法
  • 文件的读写方法

原文地址http://soft.dog/2016/11/24/c-basic-17/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 概要
    • 文件读写的基础操作
      • 代码注解
      • 思路
      • 基础知识点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档