无限循环和奇怪字符:while(chars=fgetc(map)!=EOF)

无限循环和奇怪字符:while(chars=fgetc(map)!=EOF),c,infinite-loop,eof,operator-precedence,getchar,C,Infinite Loop,Eof,Operator Precedence,Getchar,我试图读取一个带有fopen()和fgetc()的文件(map.txt),但是我得到了一个无限循环和奇怪的字符作为输出。我尝试过不同的条件,不同的可能性,循环总是无限的,好像EOF不存在 我想创建一个带有文本文件的地图平铺基本系统(Allegro),为此我需要学习如何阅读它们。因此,我试图简单地读取文件并逐字打印其内容 void TileSystem() { theBitmap = al_load_bitmap("image.png"); // Ignore it. fl

我试图读取一个带有fopen()和fgetc()的文件(map.txt),但是我得到了一个无限循环和奇怪的字符作为输出。我尝试过不同的条件,不同的可能性,循环总是无限的,好像EOF不存在

我想创建一个带有文本文件的地图平铺基本系统(Allegro),为此我需要学习如何阅读它们。因此,我试图简单地读取文件并逐字打印其内容

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
我从输出中得到的是一个无限循环:

???????????????????????????????????????????????????
???????????????????????????????????????????????????
???????????????????????????????????????????????????...
但我在终端上看到的是:

我只需要读取所有字符,编译器需要正确识别文件的结尾

chars = fgetc( map ) != EOF
(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);
  }
}
#包括
int main(){
文件*fp=fopen(“test.c”、“rt”);
INTC;
而((c=fgetc(fp))!=EOF){
普查尔(c);
}
}
=
的优先级高于
=
,您可能希望改为执行类似操作:
(chars=fgetc(map))!=EOF

此行:

chars = fgetc( map ) != EOF
是这样被处决的:

chars = (fgetc( map ) != EOF)
因此,您应该添加如下括号:

chars = (fgetc( map ) != EOF)
看起来不对。。。您是否尝试过:

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

今天的小贴士:用括号括起来!依赖于运算符优先级的深奥规则是一种撕裂的方法。顺便说一句:loopcondition是循环不变的。好吧,有缺陷的字符也随之消失,但无限循环仍然存在。我不明白为什么。。。它不停地打印123456789123456789123456789123456789123456789。它不识别EOF。我这样做了(我现在修复了),但无限循环仍然存在。我这样做了(我现在修复了),但无限循环仍然存在。您必须在循环中调用TileSystem()函数,然后。。。尝试在函数开头添加“putchar('\n'):如果您得到多行“123456789”,则TileSystem()将被重复调用;如果你仍然得到一行“123456789123456789…”,那么我不知道:)
while ( loopCondition == 1 && ( ( chars = fgetc( map ) ) != EOF ) ) {