【发布时间】: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