0

私はこのサイトでいくつかの質問を読み、ファイルからデータを読み取る以下のコードを書くことができました (以下のコードの前に表示)。問題は、コードが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);
4

2 に答える 2

0

簡単な修正は、すべてを変更するa != '\n'ことa != EOF && a != '\n' です

原則として、 のwhile( (a=fgetc(fp))!=EOF) {...}代わりに を使用する必要がありdo/whileます。これは、この特定のエラーを回避するのに役立ち、はるかに慣用的だからです。また、そのまま使用しないでfeofください。その目的feofは、データの終わりに到達したことと、読み取りエラーが発生したことを区別することです。コード内で読み取りエラーをまったく処理していないため、 を呼び出しても意味がありませんfeof。(読み取りエラーが発生した場合、feofは常に false を返し、再び無限ループに入ることに注意してください。)

于 2013-07-22T11:55:27.010 に答える
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);
}
于 2013-07-22T12:39:03.847 に答える