我在这个网站上已经阅读了几个问题并设法编写下面的代码,该代码从文件中读取数据(在下面的代码之前显示)。问题是代码在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);
答案 0 :(得分:0)
简单的解决方法是将您的所有a != '\n'
更改为a != EOF && a != '\n'
还有许多其他修复也应该进行,但这应该可以解决问题。
作为一般规则,您应该while( (a=fgetc(fp))!=EOF) {...}
代替do/while
,因为它有助于避免此特定错误,而且更为惯用。另外,请勿使用feof
。 feof
的目的是区分已到达数据的末尾和遇到读取错误。由于您在代码中根本没有处理读取错误,因此调用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);
}