user-0 提问: 请教一下，我执行到了fges()，函数遇到了段错误

回复:
user: user-0
content: 引用 11 楼 zjq9931 的回复:[quote=引用 8 楼 遥_望 的回复:] 刚才加上了，还是不行。我把其他逻辑处理的都注释掉了，只是运行fgets函数，还是出错 那就跟踪调试吧，这个会不？ 读取66次就会有问题？ 简单的就是增加一个变量，增加一个条件，66次的时候，设置一个断点，看看是因为什么错误了。 [/quote] 刚才用gdb调试过了  这是不知道是不是我的rewind错了呢，突然出现rewind.c没有那个文件或目录，这个怎么解决呢

user: user-1
content: 引用 8 楼 遥_望 的回复:刚才加上了，还是不行。我把其他逻辑处理的都注释掉了，只是运行fgets函数，还是出错 那就跟踪调试吧，这个会不？ 读取66次就会有问题？ 简单的就是增加一个变量，增加一个条件，66次的时候，设置一个断点，看看是因为什么错误了。

user: user-0
content: 引用 9 楼 qybao 的回复:把static FILE *fp = NULL;改成非static试试，也就是每次都重新打开文件，读完关闭文件，看看会不会也出错，如果不出错，那就是rewind(fp);失败了 另外，sprintf(energy_str,"%f",energy);之类的处理最好指定小数长度，如%.4f（保留4位小数）之类的，否则小数过多数组也可能越界 刚才试了一下，如果读完关闭文件，执行fclose()会出现 free(): invalid next size (normal): 0xb5d00c88错误。 要崩溃，不知道怎么搞，我这又只是单线程的读文件，也没有用到动态内存

user: user-2
content: 把static FILE *fp = NULL;改成非static试试，也就是每次都重新打开文件，读完关闭文件，看看会不会也出错，如果不出错，那就是rewind(fp);失败了 另外，sprintf(energy_str,"%f",energy);之类的处理最好指定小数长度，如%.4f（保留4位小数）之类的，否则小数过多数组也可能越界

user: user-0
content: 引用 7 楼 zjq9931 的回复:fgets(strLine,MAX_LINE,fp);   这一句改成 fgets(strLine,MAX_LINE-1,fp);   开始读取循环之前记得初始化一下 memset(strLine,  0,  MAX_LINE);  char strLine[MAX_LINE] = {0}; 	 	static FILE *fp = NULL; 	static int i = 1; 	if(fp == NULL) 	{ 		fp = fopen(GE_FILE_PATH,"r"); 		if(fp == NULL) 			exit(0); 	} 	 	printf("energy:%f\n",energy); 	sprintf(energy_str,"%f",energy); 	printf("energy_str:%s\n",energy_str); 	rewind(fp); 	printf("************************************************************************    i= %d\n",i); 	i++; 	while(1)									 	{  		memset(strLine,0,MAX_LINE); 		fgets(strLine,MAX_LINE-1,fp);		 		break; 		/* if(feof(fp))  			break; 		//printf("%s\n",strLine); 		//获取到第一列数据(能量)，如果与传入进来的能量不一样，则不往下执行，继续获取下一行数据。 		char *p = strtok(strLine, " "); 		sprintf(temp,"%f",atof(p)); 		//printf("temp:%s\n",temp); 		//printf("energy_str:%s\n",energy_str); 		strcpy(cmp_str,energy_str);  刚才加上了，还是不行。我把其他逻辑处理的都注释掉了，只是运行fgets函数，还是出错

user: user-1
content: fgets(strLine,MAX_LINE,fp);   这一句改成 fgets(strLine,MAX_LINE-1,fp);   开始读取循环之前记得初始化一下 memset(strLine,  0,  MAX_LINE);

user: user-0
content: 总结： 1、经过gdb单步调试了一上午，所有的变量都没有出错，文件指针、strLine 都为正确的值 2、如果没有flose()，free()那么程序就不会出现段错误。只要一执行，就会报出非法地址，看情况像是文件指针和strLine出错，但是gdb调试看出地址是绝对没错的，这是一个奇怪的现象。 3、在调用Analy_G_File（）函数的函数中，使用了malloc()分配了动态内存。因此我将这里改成了栈分配，至此程序一切正常了 4、问题不在fgets()，rewind()。  在另一个函数用malloc分配时，如果我free掉Analy_G_File()中的strLine，会出现非法指针或者重释放错误（这两种错误是概率出现其中一个），如果改成栈分配了，程序就正常了。  具体什么原因，实在想不明白。因为项目进度问题，就此结贴。 谢谢各位大佬了。

user: user-3
content: if(feof(fp))              break; 改成： if(!feof(fp))              break;  feof若文件结束返回0，文件不结束返回非0.

user: user-1
content: 引用 12 楼 遥_望 的回复:这是不知道是不是我的rewind错了呢，突然出现rewind.c没有那个文件或目录，这个怎么解决呢 这个程序的第43行，rewind(fp)出错了。 rewind34行是库的源文件了。 打出来最开始fp啊。然后对比戳戳之后的fp啊。 估计程序是有越界，导致fp的值被修改了。

user: user-0
content: 大佬们走过路过帮忙解答一下，小弟不才，找不出原因来

user: user-0
content: 引用 3 楼 qybao的回复:static FILE *fp = NULL; //文件指针，静态，打开一次就不会重复打开了 用了静态变量，每次进入函数不是从头开始读的，所以有eof的可能，所以应该先判断不为eof再读取数据 不是，我前面有执行指针偏移了！rewind(fp);

user: user-0
content: 不是，我前面有执行指针偏移了！rewind(fp);

user: user-2
content: static FILE *fp = NULL; //文件指针，静态，打开一次就不会重复打开了 用了静态变量，每次进入函数不是从头开始读的，所以有eof的可能，所以应该先判断不为eof再读取数据

user: user-0
content: 引用 1 楼 qybao的回复:是不是读到文件结尾了已经eof了 下面两句代码交换一下位置，先判断是否eof，不为eof再读数据 fgets(strLine,MAX_LINE,fp);                if(feof(fp)) 试过了不行！我这里是每次进入这个函数都是从头开始读的，在第66次进去的时候，就段错误了！

user: user-2
content: 是不是读到文件结尾了已经eof了 下面两句代码交换一下位置，先判断是否eof，不为eof再读数据 fgets(strLine,MAX_LINE,fp);                if(feof(fp))