首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不读EOL吗?

不读EOL吗?
EN

Stack Overflow用户
提问于 2013-04-01 04:23:06
回答 2查看 423关注 0票数 1

所以,基本上,我用C写了一个基于文本的rpg,我想创建一个地图系统。基本上,im有问题的函数是从如下文件中读取“文本地图”:

代码语言:javascript
复制
----------\n
|c  x    [\n
|   x    |\n
]        |\n
----------\0

它基本上是使用2d数组构建的。*EDIT我添加了映射在实际数组中的样子。是因为我不喜欢终止每一行

这是我有困难的功能:

代码语言:javascript
复制
char** readMap(char* map_to_read,int h, int w){
    FILE* fp;
    int a = 0, b = 0;
    char map_return[h][w];
    char* c;

    fp = fopen(map_to_read, "r");

    for(a = 0; a < h; a++){
        for(b = 0; b < w; b++){
            c = (char*)malloc(sizeof(char) * w);
            map_return[a][b] = fgets(c, w, fp);
            printf("%s", c);
        }
        free(c);
    }

    fclose(fp);
    return map_return;
}

所有内容都会一直读到最后,因为fget()没有读取EOL。从内部看,printf就是这样的:http://i.imgur.com/KojbjDm.png

我能再来一双眼睛看这个吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-01 05:09:30

分析

w中的值是多少?对于显示的数据,得到换行符至少应该是12 (10个字符、换行符和null)。稍后您会遇到问题,因为您不能(安全地)返回本地数组map_return,但这是一个单独的错误。另外,您应该在map_return[a][b] = fgets(c, w, fp);行上得到类型不匹配警告,因为map_return[a][b]charfgets()返回char *。如果你要保存一个指向free(c)的指针,你就买不起它了。这里有很多问题..。

你的答复是:

基本上它是array[h][w],所以w表示数组一行中的元素数。

得到了进一步的回应:

所以你需要两块独立的记忆。一个用于读取行并对其进行验证。它可以是简单的char line[128];。然后使用if (fgets(line, sizeof(line), fp) == 0) { ...process EOF/error...}。如果通过,则验证行,当行通过验证时,可以安排将行中的w字符复制到map_return数组中。您必须决定是否在使用字符串(以“\0”结尾)。你可以提出任何一个理由。然后,您必须处理“不返回局部变量”的问题。

综合

我建议您将接口更改为函数,以便调用方为其分配内存。

此代码编译(但尚未运行)。它不会对它所读的行进行太多的验证;您可以决定还需要做什么。

代码语言:javascript
复制
#include <stdio.h>
#include <stdbool.h>

extern bool readMap(char* map_to_read, int h, int w, char map[h][w]);

bool readMap(char* map_to_read, int h, int w, char map[h][w])
{
    FILE* fp;

    if ((fp = fopen(map_to_read, "r")) == 0)
        return false;

    for (int a = 0; a < h; a++)
    {
        char line[128];
        if (fgets(line, sizeof(line), fp) == 0)
        {
            fclose(fp);
            return false;
        }
        for (int b = 0; b < w; b++)
        {
            // Validation
            if (line[b] == '\n' || line[b] == '\0')
            {
                fclose(fp);
                return false;
            }
            map[a][b] = line[b];
            printf("%c", line[b]);
        }
        putchar('\n');
    }

    fclose(fp);
    return true;
}

此代码假定您不在map数组中存储以空结尾的字符串。

示例呼叫:

代码语言:javascript
复制
int h = 5;
int w = 10;
char map[h][w];

if (mapRead("somefile", h, w, map))
    ...process initialized map...
else
    ...report failure...

函数的错误报告是最小的;您可以根据需要对其进行改进。

票数 0
EN

Stack Overflow用户

发布于 2013-04-01 05:23:07

与其责怪fgets,不如看看你的逻辑。在内部循环中循环w次数,每次读取w字节.这是h*w*w字节总数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15737589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档