fgets()卡在无限循环中

时间:2013-03-27 05:39:28

标签: c fgets string.h

如果我使用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给了我无限循环。

任何帮助都将不胜感激。

3 个答案:

答案 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)

修复了问题。

相关问题