从文本文件中读取时无限循环

时间:2013-07-22 11:48:38

标签: c file newline infinite-loop fgetc

我在这个网站上已经阅读了几个问题并设法编写下面的代码,该代码从文件中读取数据(在下面的代码之前显示)。问题是代码在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);

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我建议使用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);
}