当前位置:首页 » 编程语言 » c语言结构体中录入很多数据
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言结构体中录入很多数据

发布时间: 2022-09-09 08:35:12

‘壹’ c语言 把结构体中的数据写入文件的问题

//根据楼主给出的结构体structstudent以及函数wirte(),稍作修改.
//假设每个学生选修的课程数目不一定相同,课程名称也不一定相同.
//以下是修改后的测试代码.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedefstructstudent
{
//原代码charke[20];
charke[20][15];//可存放20个课程名称,每个名称长度最大14
charxuehao[15];//学号(学号也可以用int整数型,或者long型)
charname[15];//姓名
intchengji[21];//chengji[20]用于保存总成绩
intkeQty;//实际选修了多少个课程
floataverage;//平均分
}AO;

AOxx[50];

//输入数据
inttestInput()
{
intn;//实际输入多少个学生
intm;//选修多少个课程
inti;

n=3;

strcpy(xx[0].xuehao,"1001");
strcpy(xx[0].name,"张一");
xx[0].keQty=1;
strcpy(xx[0].ke[0],"math");
xx[0].chengji[0]=90;
m=xx[0].keQty;
for(i=0;i<m;i++)
{
xx[0].chengji[20]+=xx[0].chengji[i];
}
xx[0].average=1.0*xx[0].chengji[20]/m;

strcpy(xx[1].xuehao,"1002");
strcpy(xx[1].name,"李二");
xx[1].keQty=3;
strcpy(xx[1].ke[0],"math");
strcpy(xx[1].ke[1],"english");
strcpy(xx[1].ke[2],"C");
xx[1].chengji[0]=81;
xx[1].chengji[1]=82;
xx[1].chengji[2]=87;
m=xx[1].keQty;
for(i=0;i<m;i++)
{
xx[1].chengji[20]+=xx[1].chengji[i];
}
xx[1].average=1.0*xx[1].chengji[20]/m;

strcpy(xx[2].xuehao,"1003");
strcpy(xx[2].name,"王三");
xx[2].keQty=2;
strcpy(xx[2].ke[0],"math");
strcpy(xx[2].ke[1],"english");
xx[2].chengji[0]=85;
xx[2].chengji[1]=86;
m=xx[2].keQty;
for(i=0;i<m;i++)
{
xx[2].chengji[20]+=xx[2].chengji[i];
}
xx[2].average=1.0*xx[2].chengji[20]/m;

printf(" 录入成功. ");

returnn;
}
//写入文件
voidwriteFile(AOdata[],intn)
{
FILE*fp;
inti;
intret;

fp=fopen("save.txt","w");
if(fp==NULL)
{
printf(" 打开文件错误. ");
exit(1);
}

for(i=0;i<n;i++)//将记录逐条写入文件
{
ret=fwrite(&data[i],sizeof(AO),1,fp);
if(ret!=1)
{
printf(" 写入文件时出现错误. ");
break;
}
}
fclose(fp);
printf(" 写入文件save.txt结束. ");
}
//读取文件
voidreadFile()
{
AOtestData[50];//临时的结构体数组,只用于测试
FILE*fp;
intn;
intm;
inti,j;
intret;

fp=fopen("save.txt","r");
if(fp==NULL)
{
printf(" 打开文件错误. ");
exit(1);
}

n=0;
//函数feof(),检测是否遇到文件结束符,
//如果文件结束,则返回非1值,否则返回0
while(!feof(fp))
{
ret=fread(&testData[n],sizeof(AO),1,fp);
if(ret==1)
{
n++;
}
}
fclose(fp);//关闭文件

printf(" 读取文件结束,得到%d条记录. ",n);
for(i=0;i<n;i++)
{
printf("第%d个学生 ",i+1);
printf("学号:%s ",testData[i].xuehao);
printf("姓名:%s ",testData[i].name);
m=testData[i].keQty;
printf("选修%d个课程 ",m);
for(j=0;j<m;j++)
{
printf("%s:%d ",testData[i].ke[j],testData[i].chengji[j]);
}
printf("总成绩:%d ",testData[i].chengji[20]);
printf("平均分:%0.1f ",testData[i].average);
printf(" ");
}
}

intmain(void)
{
intn;

n=testInput();//输入数据

writeFile(xx,n);//写入文件

readFile();//读取文件

return0;
}

‘贰’ 用C语言结构体解决 “从键盘输入五个用户的数据,包括姓名和电话号码,要求按姓名排序后,输出用户数据

//希望我的回答对你的学习有帮助
#include<stdio.h>
#include<string.h>

structStudent
{
charName[10]; //学生的姓名,使用字符数组存储,长度为10
charPhoneNumber[15]; //学生的电话号,使用字符数组存储,长度为15
}stu[5],temp; //结构体数组,长度为5,用来存放5个学生的信息
//临时变量,用在冒泡排序的过程中交换数据

intmain()
{
for(inti=0;i<5;i++) //输入5个学生的基本信息
{
scanf_s("%s%s",stu[i].Name,10,&stu[i].PhoneNumber,15); //输入字符串,使用%s标记。其中每个字符串使用“空格”分开
//如果输入的字符串包含“空格”,使用gets函数
}

for(inti=0;i<4;i++) //冒泡排序,外层循环只需要循环(长度-1)次
//因为剩下最后一个数据不需要比较
{
for(intj=0;j<4-i;j++) //第一次循环,比较的次数为(长度-1)
//每次循环的次数都在缩小
//因为每次循环之后,最值已经放在了数组的尾部
//所以在下一次循环时,就可以排除这个最值,把比较的范围
{
if(strcmp(stu[j].Name,stu[j+1].Name)>0) //strcmp由定义得到,它就是一个根据Ascii码,对字符串比较的函数
//如果strcmp返回0,证明两个字符串相等
//如果strcmp返回-,证明第一个字符串比第二个字符串小
//这个小,是指在两个字符串中第一个不相同的字符在Ascii码表中的相对位置
//如果strcmp返回+,证明第一个字符串比第二个字符串大
//这个大,是指在两个字符串中第一个不相同的字符在Ascii码表中的相对位置
{
temp=stu[j]; //进行数据交换
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}

for(inti=0;i<5;i++) //输出5个学生的基本信息
{
printf("%s%s ",stu[i].Name,stu[i].PhoneNumber);
}

getchar();getchar();

return0;
}

‘叁’ C语言中利用scanf语句输入多个值的问题

1、有一个很严重的错误,输入字符数组的两个

scanf("%d %s %c %c",&person[i].num,&person[i].name,&person[i].sex,&person[i].job);

scanf("%s",&person[i].category.position);

2、把这两行中字符数组输入时前面的&符号去掉,对字符数组输入本身就是地址,不要加&,改成这样

scanf("%d %s %c %c",&person[i].num,person[i].name,&person[i].sex,&person[i].job);

scanf("%s",person[i].category.position);

3、其他的也没有什么错误,记着输入时候,那几个值之间用一个空格隔开,用scanf()函数输入的时候,本质是,你给scanf一个地址,这个函数会根据你输入的地址把,输入缓冲区中的数据放在指定地址处

4、像int ,char,double,long,float这些基本类型,再分配空间的时候,只是给他们一个空间,所以用scanf()输入的时候,要加&取地址符号,才能给他们赋值

5、然而char *,char [],这些本身是一块区域的首地址,本身就是地址,所以用scanf时,不用加&因此,输入里面不需要加的只有,person[i].name,person[i].category.position两个,其他的都是基本类型,因此都需要加

(3)c语言结构体中录入很多数据扩展阅读:

优缺点

1、简洁紧凑、灵活方便

C语言一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。

C语言的 Hello World 程序

2、运算符丰富

C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。

3、数据类型丰富

C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,使程序效率更高。

4、表达方式灵活实用

C语言提供多种运算符和表达式值的方法,对问题的表达可通过多种途径获得,其程序设计更主动、灵活。它语法限制不太严格,程序设计自由度大,如对整型量与字符型数据及逻辑型数据可以通用等。

5、允许直接访问物理地址,对硬件进行操作

由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位(bit)、字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。

6、生成目标代码质量高,程序执行效率高

C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编程序生成的目标代码效率低10%~20%。

7、可移植性好

C语言在不同机器上的C编译程序,86%的代码是公共的,所以C语言的编译程序便于移植。在一个环境上用C语言编写的程序,不改动或稍加改动,就可移植到另一个完全不同的环境中运行。

8、表达力强

C语言有丰富的数据结构和运算符。包含了各种数据结构,如整型、数组类型、指针类型和联合类型等,用来实现各种数据结构的运算。C语言的运算符有34种,范围很宽,灵活使用各种运算符可以实现难度极大的运算。

C语言能直接访问硬件的物理地址,能进行位(bit)操作。兼有高级语言和低级语言的许多优点。它既可用来编写系统软件,又可用来开发应用软件,已成为一种通用程序设计语言。另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。

‘肆’ c语言中如何在结构体中输入数据,并将结构体储存到文件之中。比方说输入影片的信息 struct N

#include "stdio.h"
#include "stdlib.h"
struct s
{
int id;
char name[10];
int co1;
int co2;
int co3;
int co4;
};
int main()
{
int i=0,count;
struct s st[10];
char fname[10],ch;
FILE *infile,*outfile;
printf("please input data file name:\n");
scanf("%s",fname);
infile=fopen(fname,"r");
outfile=fopen("output.txt","w");
if(infile==NULL)
{
printf("\nFailed to open the file");
exit(1);
}
fscanf(infile,"%d",&count);
while(i<count)
{
fscanf(infile,"%d %s %d %d %d %d\n",&(st[i].id),st[i].name,&(st[i].co1),&(st[i].co2),&(st[i].co3),&(st[i].co4));
fprintf(outfile,"%d %s %d %d %d %d\n",st[i].id,st[i].name,st[i].co1,st[i].co2,st[i].co3,st[i].co4);
i++;
}
fclose(infile);
fclose(outfile);
}

‘伍’ 怎么用C语言的scanf实现一次输入若干个数据

这里我们先建一个固定长度的数组,如下图,数组长度为1000

然后就需要用到循环了,并且设置一个按键“回车键”跳出循环。

这样,不断循环就可以不断地将数字存进数组里。当我们按回车键的时候就会跳出循环,结束输入。而输入的数据就会保存在num数组之中,唯一的缺点就是数组长度是固定的。

(5)c语言结构体中录入很多数据扩展阅读:

在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用静态数组的办法很难解决。

为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。

动态数组是指在声明时没有确定数组大小的数组,即忽略方括号中的下标;当要用它时,可随时用ReDim语句(C语言中用malloc语句)重新指出数组的大小。使用动态数组的优点是可以根据用户需要,有效利用存储空间。

对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!

对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。

因此,利用动态数组就可以避免静态数组的长度不够,内存溢出等问题,换言之,可以更灵活的存储数组,这样就可以根据输入多少个数,创建多大的数组进行存储。

‘陆’ C语言中,如何将一个结构体内的信息全部输入到一个文件中

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
structstudent
{
charname[20];
intage;
charnum[20];
}stu;
voidwrite()
{
FILE*file;
if((file=fopen("C:\123","wb"))==NULL)
{
printf("openfilefailed! ");
exit(0);
}
//stustu1;
strcpy(stu.name,"张三");
strcpy(stu.num,"09111626");
stu.age=19;
fwrite(&stu,sizeof(structstudent),1,file);
fclose(file);

}
voidread()
{
FILE*file;
if((file=fopen("C:\123","rb"))==NULL)
{
printf("openfilefailed! ");
exit(0);
}
//stustu2;
fread(&stu,sizeof(structstudent),1,file);
fclose(file);
printf("name=%s,age=%d,num=%s ",stu.name,stu.age,stu.num);
}
voidmain()
{
//write();
read();

}

‘柒’ C语言中struct结构体含有很多类型数据时如何一个scanf输入所有类型的数据

for (i=0;i<10;i++)
scanf("%d %c %f",&sch[i].num,&sch[i].name,&sch[i].score ); 就可以了。
float score,float 型输入格式 是 %f 不是 %lf。
&sch[1].name 里的 1 改用 i.
注意,你的 name 只允许 1个字符。若多个字符 就会出错。
如果 改为:
struct student {
int num;
char name[20]; // 用字符串,而不是单个字符
float score;
} sch[10];
输入格式 name 用 %s, 参数 sch[i].name,没有 &号:
for (i=0;i<10;i++)
scanf("%d %s %f",&sch[i].num, sch[i].name,&sch[i].score );

‘捌’ C语言中,将多个结构体数据写到一个文件中,应该如何读取

C语言把一个结构体数组写入文件分三步:
1、以二进制写方式(wb)打开文件
2、调用写入函数fwrite()将结构体数据写入文件
3、关闭文件指针

相应的,读文件也要与之匹配:
1、以二进制读方式(rb)打开文件
2、调用读文件函数fread()读取文件中的数据到结构体变量
3、关闭文件指针

参考代码如下:

#include<stdio.h>
structstu{
charname[30];
intage;
doublescore;
};
intread_file();
intwrite_file();
intmain()
{
if(write_file()<0)//将结构体数据写入文件
return-1;
read_file();//读文件,并显示数据
return0;
}
intwrite_file()
{
FILE*fp=NULL;
structstustudent={"zhangsan",18,99.5};
fp=fopen("stu.dat","wb");//b表示以二进制方式打开文件
if(fp==NULL)//打开文件失败,返回错误信息
{
printf("openfileforwriteerror ");
return-1;
}
fwrite(&student,sizeof(structstu),1,fp);//向文件中写入数据
fclose(fp);//关闭文件
return0;
}
intread_file()
{
FILE*fp=NULL;
structstustudent;
fp=fopen("stu.dat","rb");//b表示以二进制方式打开文件
if(fp==NULL)//打开文件失败,返回错误信息
{
printf("openfileforreaderror ");
return-1;
}
fread(&student,sizeof(structstu),1,fp);//读文件中数据到结构体
printf("name="%s"age=%dscore=%.2lf ",student.name,student.age,student.score);//显示结构体中的数据
fclose(fp);//关闭文件
return0;
}