2

fopen()とfgetc()を使用してファイル(map.txt)を読み取ろうとしていますが、出力として無限ループと奇妙な文字が表示されます。私はさまざまな条件、さまざまな可能性を試しましたが、EOFが存在しないかのように、ループは常に無限です。

テキストファイル(Allegro)を使用してマップタイルの基本システムを作成したいので、その読み方を学ぶ必要があります。そのため、ファイルを読み取ってその内容を1文字ずつ印刷しようとしています。

void TileSystem() {

    theBitmap = al_load_bitmap("image.png"); // Ignore it.  

    float tileX = 0.0; // Ignore it.    
    float tileY = 0.0; // Ignore it.    
    float tileXFactor = 0.0; // Ignore it.  
    float tileYFactor = 0.0; // Ignore it.  

    al_draw_bitmap( theBitmap, 0, 0, 0 ); // Ignore it. 

    FILE *map;
    map = fopen( "map.txt", "r");

    int loopCondition = 1;
    int chars;

    while ( loopCondition == 1 && ( chars = fgetc( map ) != EOF ) ) {
            putchar( chars );
        }
}

map.txtの内容は次のとおりです。

1
2
3
4
5
6
7
8
9

そして、私が出力から得るものは、次の無限ループです。

???????????????????????????????????????????????????
???????????????????????????????????????????????????
???????????????????????????????????????????????????...

しかし、私がターミナルで見るものは次のとおりです。

EOFバグ

さて、私はすべての文字を読み取る必要があり、コンパイラはファイルの終わりを正しく認識する必要があります。

4

4 に答える 4

4
chars = fgetc( map ) != EOF

する必要があります

(chars = fgetc(map) ) != EOF

これは完全な実例です:

#include <stdio.h>

int main() {
  FILE *fp = fopen("test.c","rt");
  int c;
  while ( (c=fgetc(fp))!=EOF) {
    putchar(c);
  }
}
于 2013-01-27T21:42:48.753 に答える
1
chars = fgetc( map ) != EOF 

!=よりも優先順位が高いので=、代わりに次のようなことをしたいと思うかもしれません。(chars = fgetc( map )) != EOF

于 2013-01-27T21:42:59.053 に答える
1

この行:

chars = fgetc( map ) != EOF

このように実行されています:

chars = (fgetc( map ) != EOF)

したがって、次のように括弧を追加する必要があります。

(chars = fgetc( map )) != EOF
于 2013-01-27T21:43:10.910 に答える
1
while ( loopCondition == 1 && ( chars = fgetc( map ) != EOF ) ) {

正しく見えません...試してみましたか:

while ( loopCondition == 1 && ( ( chars = fgetc( map ) ) != EOF ) ) {
于 2013-01-27T21:45:09.297 に答える