0

テキストファイルから配列を埋めようとしています。私は fgetc を使用していますが、問題はテキスト ファイルに含まれる改行文字を処理することです。私は現在持っている、

for(i = 0; i < rows; i++){
    for(j = 0; j < columns; j++){
        if((fgetc(fp) == '\n') || (fgetc(fp) == '\r')){
            fgetc(fp); 
            array[i][j] = fgetc(fp);    
        else{
            array[i][j] = fgetc(fp); 
        }
        printf("i %d j %d char %c code %d\n", i, j, array[i][j], array[i][j]); 
     }
}

アイデアは、改行文字がある場合、次の文字を取得できるように、ループの同じ i,j 位置にある間にファイル ポインターを進めたいということです。この出力は、最初の 2 行がごちゃ混ぜになってから、文字コード -1 の文字の読み取りを開始します。私は何かひどく間違ったことをしていますか?

4

4 に答える 4

1

最初のif()ステートメントには、少し問題があります。これを行う場合:

if((fgetc(fp) == '\n') || (fgetc(fp) == '\r')){
        fgetc(fp); 
        array[i][j] = fgetc(fp); 

あなたは実際にfgetc(fp)4回電話をかけています。if() ステートメントで 2 回、後で 2 回。おそらく、次のようなものをもっと探しているでしょう:

for(i = 0; i < rows; i++){
    for(j = 0; j < columns; j++){
        int test = fgetc(fp);
        if(test != '\n' && test != '\r')
            array[i][j] = test;
        //We want to "undo" the last j++ if we got a whitespace
        else
            j--;
        printf("i %d j %d char %c code %d\n", i, j, array[i][j], array[i][j]); 
     }
}

この例では、fgetc(fp)反復ごとに 1 回だけ呼び出し、\n または \r でない場合は配列に入れます。

申し訳ありませんが、私は の経験がほとんどありませんfgetc()。私がやったことで信じられないほどひどいことに気づいたら、私に知らせてください!

于 2013-08-06T22:47:05.423 に答える
1

エラーの原因の 1 つがすぐにわかります。次の行で:

if((fgetc(fp) == '\n') || (fgetc(fp) == '\r'))

fgetc() には 2 つの呼び出しがあります。これは、最初の呼び出しが '\n' を返さない場合、別の呼び出しが行われ、その戻り値が '\r' と比較されることを意味します。fgetc を呼び出すたびにポインタが進むため、これにはファイル ポインタを 2 回進める効果があります。これを行うためのより良い方法は、1 つの文字をフェッチし、それが '\n' または '\r' であるかどうかをテストし、これが true である場合にのみ fgetc への別の呼び出しでファイル ポインターをインクリメントすることです。例えば:

char letter = fgetc(fp);
if((letter == '\n') || (letter == '\r')
...
...

これを試して、それでも同じエラーが発生するかどうかを確認してください。

于 2013-08-06T22:47:09.517 に答える