1

如果我使用 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 循环中放了一条打印语句,显示整数“i”是什么,它被困在数字 4 上,这是文本文件中 delimiter1 的总数,让我相信 EOF 给了我无限循环。

任何帮助,将不胜感激。

4

3 回答 3

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 100char ,因此"Delimiter2"可能会从具有其他一些章程的文件中读取,这就是 strcmp() 即使在读取时也不返回 0 的原因"Delimiter2"

尝试通过 printf you temp_string 来修改你的代码。

此外,您可以使用strstr()函数代替在文件strcmp()中查找"Delimiter2"。如果在 temp_string 中找到任何位置,strstr()则返回有效地址,否则返回NULL。"Delimiter2"

于 2013-03-27T06:02:05.863 回答
0

感谢所有的投入。有人指出,在内部的while循环中

while(j!=0 && temp_string != NULL){

temp_string != NULL 从未被发现。将其更改为

!feof(inFile)

解决了这个问题。

于 2013-03-27T17:05:23.810 回答
0

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

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

于 2013-03-27T06:00:57.013 回答