c语言 做一个学生信息管理程序遇到的问题总结

1.文件原有信息覆盖问题(可以直接看2.文件获取数据错乱或无法获取文件数据 和 3.程序异常终止)

文件读写模式:引自菜鸟教程

主要注意 r+,w+的区别
以w+方式打开,原文件内容一打开就被删除

2.储存到文件或者从文件中获取的数据错乱,或者没有获得数据

原因:
1.储存该数据的变量本身就没有获取到数据,不然就是输出语句错了,改下输出语句就好了。

解决方法:
①利用scanf和fscanf的返回值来判断是否成功读取数据
例如:

	if(scanf("%d %d %s",&i,&n,s) == 3)//换为fscanf同理 
	{
    
    
		printf("数据输入正确"); 
	}
	else
	{
    
    
		printf("数据输入错误"); 
	} 

从以上代码可得到,一直输入数据直到输入正确为止的代码
fflush()在头文件#include <stdlib.h>

while(scanf("%d %s %c",&data.snum,  data.name, &data.sex, )!=3)//数据输入异常处理 
	{
    
    
		 
		fflush(stdin);//清空缓冲区,防止上次输入对此次的影响
		printf("本次输入错误,请重新输入:\n");
	}//数据输入异常处理 

如果数据获取或者输入错误原因(解决方法)如下:

①.从文件中获取的数据格式或者键盘输入数据的格式和fscanf()/scanf()中 “” 内格式不同:
例如中英文空格不同,%s不读空格,%c什么都读(尽量不用%c,建议换成%s等,%c会读取到上次输入输出的回车或其他符号,和缓冲区的符号,而导致其他数据读入出错),并且记住文件扫描数据时,文件指针会向后移动。

②.你没有成功打开该文件:

在调用获取文件数据的函数前,这个文件已经被上部分代码打开了,并且还没关闭,所以调用的函数不能再打开文件,也就获取不到数据。
建议对使用的文件,即用即关,别放到最后再关

2.fopen函数内的写入文件路径错误,如果文档中的程序代码的.cpp文件,没有和要打开文件在一个磁盘内,就要把绝对路径写出来,如果在一个磁盘内,写相对路径就可以了。

文件路径写法,引自百度知道

关于打印到文件的中文出现乱码,解决方法CSDN上其他人博客有讲。

3.调试程序时程序异常终止,或者一直卡在某个模块不动

寻找BUG区域的个人方法

当程序异常,且没有错误提示。那你就要自己对可能错误的地方进行分析,对代码可能出错区域写上几个printf看看哪个printf没有输出,问题就在哪,重复几次缩小范围就能找到程序卡住了的代码区域,之后可以把代码单独建立一个项目来测试。

个人遇到的错误一般有如下两种可能

1。异常终止:

如果你使用了链表,可能是链表指向下一个结点的地址没有赋值为NULL或者已经申请到的空间的地址,如果没有赋值,取得随机值可能会指向不允许被访问的内存区域,就会导致程序提前终止。

2.死循环
或者代码对某种情况缺少考虑,最后一个结点的next不为NULL,就会一直循环下去,

解决方法:
1,建议每次申请一个内存就让它的->next = NULL;你可能会觉得,我之后还有别的语句给他赋值,但那些语句赋值前你自己可能写了条件的,万一某种可能没考虑到,没赋值那不就凉了。

2,可能你的链表遍历函数,或者其它对链表进行操作的函数如,插入、创建链表等函数,不完善。看看代码有没有考虑到,空表、头结点,尾结点,有你没考虑到所有的可能的遍历形式,或结点数量,导致遍历一直进行,或者提前终止,可以单独拿出这段代码,做个函数测试。

下面是一个从文件中获取信息并用链表存储的函数,函数返回值为表头地址。
里面从first->next的结点才开始存文件数据

Node *GetFileInformation(char filename[])
{
    
    
	
	FILE *f2; 
	Node *first = NULL,*last = NULL,*s = NULL;
		 f2 = fopen(filename,"r");
	 	
		 first = (Node *)malloc(sizeof(Node));//表头 
		 first->next = NULL;//当文件为空时 ,return 的first->next 为随机值 会导致出错 
		 last = first;
		 int error = 0;
		 while(!feof(f2))//获取文件信息 
		 {
    
    
		 	
		 	s = (Node *)malloc(sizeof(Node));
		 	 s->next = NULL;
		 	
		 	if(s == NULL)//申请失败提示 
			 {
    
    
		     printf("Not able to allocate memory. \n");
		     exit(1);
         	}
         	
         	 
		 	if(fscanf(f2,"%d %s %c %d-%d-%d %d %d %d",&s -> data.snum, s -> data.name, &s->data.sex, &s-> data.birthday.year,
	           &s -> data.birthday.month, &s -> data.birthday.day, &s -> data .score[0], &s -> data.score[1], &s -> data.score[2]) == 9) //确定链表是否获取到正确的数据 
	        {
    
    
			
	 	    last -> next = s;//first为空 
	        last = s;
	        
	        } 
	        else //文件格式错误提示 
	        {
    
    
	        	if(error == 1)//至少会出现一次为EOF,文件末尾会有一个EOF 
	        	{
    
    
	        		printf("文件信息格式错误"); 
				}
	            error++;	
	  	    
	        }
	       
		} 
		  fclose(f2);
		  return first;
		 
}

总结

编写程序出错很正常,很大原因是知识掌握的不透彻。
再加上,你写个几百行的代码,不出错才怪。

1.看到或学到一个函数,或者知识,最好弄清它的各种用法,和其他用法,不要想当然的去用,不然很容易出错,不懂就查就问,不要凭感觉,代码要有严谨的逻辑,不然你错了哪了都不知道。

2.在做代码量比较多的题目,还是要分布调试,确保每步都正确,(大佬那就另说了)不要以为这浪费时间,等你都写完,结果出错了从几百行代码里找问题,那你要找多久?不更浪费时间。

3.代码还是要经常打,尤其是刚学的,没几天就忘的差不多了,到时后做题不得卡死,难受的很。而且不常打代码,一看到题目就想吐(本人感受)。还是实践才能加深记忆,用多了,也就会了。

4.打代码也挺枯燥的吧,你可以去校oj.(题库),或者PTA等学习平台刷刷题,你会发现AC的感觉,爽的一匹。学了一些,或者领悟到一些知识技巧,也可以写在博客里,写的过程也是梳理知识,考察自己的过程,有助于自己更好的掌握。

猜你喜欢

转载自blog.csdn.net/RunningBeef/article/details/106457370
今日推荐