【问题标题】:Infinite-loop when reading from a text file从文本文件读取时的无限循环
【发布时间】:2013-07-22 11:48:38
【问题描述】:

我已经阅读了该站点上的几个问题,并设法编写了下面的代码,该代码从文件中读取数据(显示在代码之前,如下所示)。问题是代码在do {...} while 段中进入无限循环,表明它不能“识别”换行符。我不知道该怎么做。此外,当我从命令行传递要读取的文件名时,它会崩溃。有人可以帮忙吗?

输入文件格式:

1 3

3 

3 1 23588769 1 2 1 4 

4 9 4788939 3 2 1 2 2 4 5 5 2 3 3 1 4 

3 5 17215766 5 2 1 1 4 5 5 4

代码:

int main (int argc, char *argv[])
{
FILE *fp = NULL;
if (argc == 1)
{
     fp = stdin;
}
else  
{
    fp = fopen( argv[1], "r" ) ;
} 
fp = fopen( argv[1], "r" ) ;  
if (fp == NULL) exit(2);   
for(i=0; i<42; i++)
     KEYS_I_HAVE[i]=0;

     fscanf( fp,"%d",&num_start_keys);
fscanf(fp, "%d",&doors);
KEYS_FOR_DOORS = (int*)malloc(doors*sizeof(int));
POINTS = (int*)malloc(doors*sizeof(int));

for(i=0; i<doors; i++)
            {   
                KEYS_FOR_DOORS[i]=0;
                POINTS[i]=0;
            }
MAP = malloc(doors*sizeof(int));

for(i=0; i<43; i++)
                MAP[i] = malloc(43*sizeof(int));
for(i=0; i<doors; i++)
            {
                for (j=0; j<43; j++)
                    MAP[i][j] = 0;
            }


for(i=0; i<(doors+1); i++)          
            {
                j=0;
                if(i==0)
                    {
                        do
                            {
                                fscanf(fp,"%d",&temp);
                                printf("%d",temp);
                                KEYS_I_HAVE[temp]++;
                                a=fgetc(fp);
                            }while(a != '\n');
                    }
                else
                    {
                        do
                            {
                                fscanf(fp,"%d",&temp);

                                if (j==0)
                                        sum += temp;
                                else
                                    {
                                        if (j==1)
                                            KEYS_FOR_DOORS[i-1] = temp;
                                        else
                                            {
                                                if(j==2)
                                                    POINTS[i-1]=temp;
                                                else

                                                    MAP[i-1][temp]++;
                                            }
                                    }
                                a=fgetc(fp);
                                j++;
                                if (feof(fp) ) break;
                            }while( a != '\n'  );
                    }
            }
 fclose(fp);

【问题讨论】:

  • 两个直接的问题:如果您不向程序提供参数,它仍然会尝试打开argv[1]。如果你使用stdin 作为输入,你仍然会在程序结束时关闭文件。
  • 除此之外,我建议你使用while (fgets(...) != NULL)读取行,然后解析行的内容。
  • 有空的时候,请修正一下代码段的格式,让Stackoverflow上的内容继续保持高质量。谢谢。
  • 我提交了固定格式的代码以供审核。基本上,这是分类选项卡与空间问题
  • 感谢我的新格式,我需要一段时间才能正确编写。 Joachim Pileborg 你能给我一个例子吗,这是我的第一个程序,我必须使用文件,我有点迷失你的意思......

标签: c file newline infinite-loop fgetc


【解决方案1】:

简单的解决方法是将您的所有a != '\n' 更改为a != EOF &amp;&amp; a != '\n' 还有许多其他修复也应该进行,但这应该可以解决问题。

作为一般规则,您应该使用while( (a=fgetc(fp))!=EOF) {...} 而不是do/while,因为它有助于避免此特定错误并且更加惯用。另外,不要照原样使用feoffeof 的目的是区分已到达数据末尾和遇到读取错误。由于您根本没有处理代码中的读取错误,因此调用feof 毫无意义。 (请注意,如果您确实遇到读取错误,feof 将始终返回 false,您将再次陷入无限循环。

【讨论】:

  • 我认为我使用了 "a != EOF && a != '\n'" 并且它没有工作它立即停止了循环并且没有它的 feof 工作它永远不会结束......真是一团糟
【解决方案2】:

我建议使用 fgets 然后解析每一行。示例:

char line[SOME_MAX_SIZE];

while ( fgets(line, SOME_MAX_SIZE, fp) )
{
    some_parse_function(line);
}

对于您的标题行,它会是这样的:

if ( fgets(line, SOME_MAX_SIZE, fp) )
{
    sscanf(line, "%d %d\n", &num_start_keys, &doors);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    相关资源
    最近更新 更多