我已閱讀本網站上的幾個問題,並設法編寫下面從代碼中讀取數據的代碼(以下代碼顯示)。問題在於代碼在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上的內容繼續保持高質量。謝謝。 – Sabuncu