如果我使用fgets()函数在整个文本文件中搜索特定的分隔符,我该如何确保fgets()不能在EOF中无限循环?
我将delimiter1到delimiter2的所有行连接到struct1 [i] .string1,其中i是delimiter1 / delimiter2模式的第n个出现。这种模式在整个文本文件中一直持续到最后,而不是有delimiter2,而是有EOF。我想连接从delimiter1到EOF的所有内容。
int i;
while(fgets(temp_string,100,inFile) != NULL){
if(strcmp(temp_string,"Delimiter1")==0){ //checks to see if current line is delimiter1
j=strcmp(temp_string,"Delimiter2");
while(j!=0 && temp_string != NULL){ //Here I try to exit if it is the EOF
fgets(temp_string,100,inFile);
strcat(struct1[i].string1,temp_string);
j= strcmp(temp_string,"Delimiter2"); //update comparator
}
i++;
}
}
}
但是,当我尝试运行此代码时,我陷入无限循环。我在内部while循环中放置了一个print语句,显示整数“i”是什么,它被卡在4号,这是文本文件中delimiter1的总数,让我相信EOF给了我无限循环。
任何帮助都将不胜感激。
答案 0 :(得分:1)
无限循环的原因是内循环:
while(j!=0 && temp_string != NULL){ //Here
^ ^ never set to NULL
| never became 0 if "Delimiter2" not found
假设,如果在temp_string值中不是 "Delimiter2"
,那么你永远不会设置为j
= 0而且你也没有将temp_string设置为NULL
您一次读入temp_string 100
char,因此可能会从文件中读取"Delimiter2"
以及其他一些章程,这就是strcmp()即使在阅读"Delimiter2"
时也不返回0的原因。
尝试通过printf temp_string来破坏你的代码。
此外,您可以使用strstr()
功能代替strcmp()
在您的文件中查找"Delimiter2"
。如果strstr()
在temp_string中找到任何位置,则"Delimiter2"
返回有效地址,其他方式为NULL。
答案 1 :(得分:0)
temp_string是你的缓冲区,我猜它是预先分配的或在堆栈上,所以它不能是NULL。这意味着内循环永远不会停止。
您必须检查内部fgets()
答案 2 :(得分:0)
感谢所有输入。有人指出,在内部while循环
while(j!=0 && temp_string != NULL){
从未找到temp_string!= NULL。 将此更改为
!feof(inFile)
修复了问题。