C fgets()陷入无限循环

C fgets()陷入无限循环,c,fgets,string.h,C,Fgets,String.h,如果使用fgets()函数在整个文本文件中搜索特定的分隔符,如何确保fgets()不会在EOF处无限循环 我正在将从delimiter1到delimiter2的所有行连接到struct1[I].string1,其中I是delimiter1/delimiter2模式的第n次出现。此模式在整个文本文件中持续,直到最后,这里没有分隔符R2,而是EOF。我想连接从delimiter1到EOF的所有内容 int i; while(fgets(temp_string,100,inFile) != NULL)

如果使用fgets()函数在整个文本文件中搜索特定的分隔符,如何确保fgets()不会在EOF处无限循环

我正在将从delimiter1到delimiter2的所有行连接到struct1[I].string1,其中I是delimiter1/delimiter2模式的第n次出现。此模式在整个文本文件中持续,直到最后,这里没有分隔符R2,而是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给了我无限循环


任何帮助都将不胜感激。

临时字符串是您的缓冲区,我猜它是预分配的或在堆栈上,因此不能为空。这意味着内部循环永远不会停止


您必须检查内部
fgets()

temp\u字符串的返回码是否是您的缓冲区,我猜它是预分配的或在堆栈上,因此不能为空。这意味着内部循环永远不会停止


您必须检查内部
fgets()的返回码。

无限循环的原因是内部循环:

 while(j!=0 && temp_string != NULL){ //Here
       ^              ^ never set to NULL
       | never became 0 if  "Delimiter2" not found
假设,如果in-temp\u字符串值不是
“Delimiter2”
,那么您永远不会设置为j=0,也不会将temp\u字符串设置为NULL

您一次读入temp_string
100
char,因此
“Delimiter2”
可能与其他一些特许一起从文件中读取,这就是strcmp()即使在读取
“Delimiter2”
时也不返回0的原因

尝试通过打印临时字符串来调试代码


此外,您还可以使用
strstr()
函数代替
strcmp()
在文件中查找
“Delimiter2”
strstr()
如果
“Delimiter2”
在temp\u字符串中找到任何位置,则返回有效地址,否则为NULL

无限循环的原因是内循环:

 while(j!=0 && temp_string != NULL){ //Here
       ^              ^ never set to NULL
       | never became 0 if  "Delimiter2" not found
假设,如果in-temp\u字符串值不是
“Delimiter2”
,那么您永远不会设置为j=0,也不会将temp\u字符串设置为NULL

您一次读入temp_string
100
char,因此
“Delimiter2”
可能与其他一些特许一起从文件中读取,这就是strcmp()即使在读取
“Delimiter2”
时也不返回0的原因

尝试通过打印临时字符串来调试代码


此外,您还可以使用
strstr()
函数代替
strcmp()
在文件中查找
“Delimiter2”
strstr()
如果
“Delimiter2”
在temp\u字符串中找到任何位置,则返回有效地址,否则为NULL

谢谢大家的意见。指出在内部while循环中

while(j!=0 && temp_string != NULL){
临时字符串!=从未找到NULL。 将此更改为

!feof(inFile)

已修复此问题。

感谢您的所有输入。指出在内部while循环中

while(j!=0 && temp_string != NULL){
临时字符串!=从未找到NULL。 将此更改为

!feof(inFile)

修复了此问题。

fgets不会返回它获取的字符数吗?与其尝试使用
temp\u string
检查EOF,不如在发生EOF/错误时,
fgets()
将返回NULL。要区分错误和EOF,请使用@Patashu返回类型为“char*”。您可以在其上使用strlen来获取大小。fgets不返回它获取的字符数吗?与其尝试使用
temp\u string
检查EOF,不如在发生EOF/错误时,
fgets()
将返回NULL。要区分错误和EOF,请使用@Patashu返回类型为“char*”。您可以在其上使用strlen来获取大小。问题不是定位“Delimiter2”,而是在到达文件结尾时退出while循环。我同意内环是问题所在。但是,文本文件的格式化方式是,在100个字符之前的每一行中都会出现一个“\n”,我相信fgets()会在该行终止。我只是过分追求灵活性。我确实试着用我的temp_字符串的printf调试我的代码,所有的行都被正确地读入和比较,直到整个文件的最后一行,temp_字符串最终是一个“\n”字符,并在这个字符串上无限循环。@SeanSenWang是的,可能还有其他错误。我是根据你在回答中提供的信息来回答的。让我知道我是否可以在这方面为您提供更多帮助。问题不是定位“Delimiter2”,而是在到达文件结尾时退出while循环。我同意内环是问题所在。但是,文本文件的格式化方式是,在100个字符之前的每一行中都会出现一个“\n”,我相信fgets()会在该行终止。我只是过分追求灵活性。我确实试着用我的temp_字符串的printf调试我的代码,所有的行都被正确地读入和比较,直到整个文件的最后一行,temp_字符串最终是一个“\n”字符,并在这个字符串上无限循环。@SeanSenWang是的,可能还有其他错误。我是根据你在回答中提供的信息来回答的。如果我能在这方面给你更多帮助,请告诉我。