【问题标题】:Infinite loop and strange characters with: while (chars = fgetc(map) != EOF)无限循环和奇怪的字符:while (chars = fgetc(map) != EOF)
【发布时间】:2013-01-11 05:39:25
【问题描述】:

我正在尝试使用 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

我得到的输出是一个无限循环:

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

但我在终端上看到的是:

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

【问题讨论】:

  • 今天的提示:给所有内容加上括号!依赖运算符优先级的深奥规则会让人流泪。
  • 顺便说一句:循环条件是循环不变的。

标签: c infinite-loop eof operator-precedence getchar


【解决方案1】:
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);
  }
}

【讨论】:

  • 好吧,被窃听的字符随之消失了,但无限循环仍然存在。我不明白为什么......它不断地打印 123456789123456789123456789123456789 。它无法识别 EOF。
【解决方案2】:
chars = fgetc( map ) != EOF 

!= 的优先级高于 =,您可能想要这样做:(chars = fgetc( map )) != EOF

【讨论】:

    【解决方案3】:

    这一行:

    chars = fgetc( map ) != EOF
    

    像这样被执行:

    chars = (fgetc( map ) != EOF)
    

    所以你应该像这样添加括号:

    (chars = fgetc( map )) != EOF
    

    【讨论】:

    • 我做了这个(我现在修好了),但无限循环仍然存在。
    【解决方案4】:
    while ( loopCondition == 1 && ( chars = fgetc( map ) != EOF ) ) {
    

    看起来不对...你试过了吗:

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

    【讨论】:

    • 我做了这个(我现在修好了),但无限循环仍然存在。
    • 您必须在循环中调用 TileSystem() 函数然后...尝试在函数开头添加“putchar('\n')”:如果您收到多行“123456789” ",然后 TileSystem() 被重复调用;如果你仍然得到一行“123456789123456789 ...”,那么我不知道:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多