【问题标题】:fgets() getting stuck in infinite loopfgets() 陷入无限循环
【发布时间】:2013-03-17 03:54:39
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

  • fgets 不返回它获取的字符数吗?
  • 而不是尝试使用temp_string 来检查EOF,fgets() 将在发生EOF/错误时返回NULL。要区分错误和 EOF,请使用 feof
  • @Patashu 返回类型是 'char*'。您可以使用 strlen 来获取大小。

标签: c fgets string.h


【解决方案1】:

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

 while(j!=0 && temp_string != NULL){ //Here
       ^              ^ never set to NULL
       | never became 0 if  "Delimiter2" not found

假设,如果 temp_string 中的值是 not "Delimiter2",那么您永远不会设置为 j = 0 并且您也不会将 temp_string 设置为 NULL

您一次读取了 temp_string 100 char,因此 "Delimiter2" 可能会从带有其他一些章程的文件中读取,这就是 strcmp() 即使在读取 "Delimiter2" 时也不返回 0 的原因。

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

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

【讨论】:

  • 问题不在于定位“Delimiter2”,如果到达文件末尾,它将退出 while 循环。我同意内部循环是问题所在。但是,文本文件的格式化方式是在每行 100 个字符之前出现一个 '\n',我相信 fgets() 会终止。我只是为了灵活性而过分。我确实尝试使用我的 temp_string 的 printf 调试我的代码,并且所有行都被读入并正确比较,直到整个文件的最后一行,其中 temp_string 最终成为一个 '\n' 字符,并在此无限循环。
  • @SeanSenWang 是的,它们也可能是其他错误。我根据您在回答中提供的信息进行了回答。如果我能在这方面为您提供更多帮助,请告诉我。
【解决方案2】:

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

你要检查内部fgets()的返回码

【讨论】:

    【解决方案3】:

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

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

    从未找到 temp_string != NULL。 将其更改为

    !feof(inFile)
    

    解决了问题。

    【讨论】:

      猜你喜欢
      • 2017-01-18
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2021-02-15
      • 2022-01-23
      相关资源
      最近更新 更多