c语言文件和结构体
有关C语言中文件和结构体的操作除了上一篇讲到的一些常见的错误一节解决方案
本次是有关其他方面的内容:
我们上面讲到从文件中录入数据存入结构体中,那么从结构体中将数据存入到文件中是怎样的?
下面是关键代码:
FILE *fp; char sname[20]={0}; fopen_s(&fp,"D:\\sport_data\\item1.txt","wt+");//打开文件 for(i=0;i<20;i++) { if(strcmp(p[i].iname,sname)!=0) { fprintf(fp,"%s\t %s\t %s\t %s\t %d\t %d\n",p[i].sname,p[i].name,p[i].sex,p[i].iname,p[i].competition,p[i].score); } } printf("文件已保存到D:\\sport_data\\item1.txt\n"); fclose(fp);
在代码中的if条件可以不用管,因为这一块是我自己加的判定条件。
这一块没什么难的地方主要是文件的地址绝对路径和相对路径之间的区别以及用法,这一块在c语言中的文件与结构体 - 王庆园 - 博客园 (cnblogs.com)这里面有讲到用法以及注意事项
下面有关于结构体中如何对比两个字符串或字符数组:
代码部分:
void schoolname()//给sc中添加学校名称 { int order=0; strcpy(sc[order].sname,s[0].sname); for(int i=0;i<20;i++) { if(strcmp(sc[order].sname,s[i].sname)!=0)/*这里非常重要我们的两个char数组比较是否相等是不可以用==的因为==比较的是两个的地址是否相等 */ { //printf("%s\n",sc[order].sname); /*这里我们采用c++中的一个函数strcmp(s1,s2)在这里有*/ order+=1; //s1<s2返回负值 //s1>s2返回正值 /*s1=s2 返回值为0*/ strcpy(sc[order].sname,s[i].sname); //和上面同理这里char数组结构体和常量之间的赋值必须这样写 } } }
这里我直接放了一个函数例子:其中的注释部分需要着重去看,strcmp(s1,s2)函数是c++库自带的用来对比两个字符型数组,通常我们使用的==针对于char型数组来说他是对比地址所以没有任何作用
strcmp返回值等于0时代表他们两个相等,反之不相等,
除此之外对于char型数组的赋值用到的是strcpy函数:strcpy(a,b)这里表达的意思是给a赋b的值。
最后记录一下一个有关于c编译器的一个问题:
在c中函数遵从自上而下顺序编译也就是说我们函数要下的有顺序
假设我们1函数要调用2函数,那么,2函数必须要 写在1函数前面,他需要让编译器先知道这个2函数,否则就会报错显示该函数未定义,
假设我们平常用的的函数都只用int main()来调用的话那好说都写在int main函数上面就行,但是我们遇到那种需要重复调用的两个函数
如:我们在菜单函数中他做出选择之后会调到其他函数,那这个函数执行完后肯定要返回菜单函数中,这时候就有个问题谁在谁的前面,都会报错(已经试过了)
那我们的解决方案是啥呢?
其实很简单,我们可以在前面事先声明告诉编译器我有这么一个函数然后下面再怎么排序都不会错
void input(); //解释:为啥这里要先声明一下这个函数 //因为cpp文件有点病他必须按顺编译,也就是说我下面某个函数如果需要调用其他函数那这个其他函数必须在这个函数前面 //简单来说1调用2的话 ,2必须在1前面 //这里菜单函数在每一个函数后面都需要调用,所以就很迷惑把哪个放在前面都出错-- 。--! //所以找出在前面先声明一下函数,告诉编译器我有这么一个函数! /*函数声明*/ void output();//统计输出的函数 void searchschool();//查询学校 void schoolname();//这里用来产生学校名称 void allscore();//计算团体分数,男子分数,女子分数 void outputall();//输出所有学校 void outputperson();//输出个人
这里仅仅是我代码中的例子给大家看一下
希望能帮助到你