Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fgets未读取EOL?_C_Fgets - Fatal编程技术网

C fgets未读取EOL?

C fgets未读取EOL?,c,fgets,C,Fgets,所以基本上我正在用C编写一个基于文本的rpg,我想创建一个地图系统。基本上,我遇到的问题是从如下文件中读取文本映射: ----------\n |c x [\n | x |\n ] |\n ----------\0 它基本上是使用二维阵列构建的*编辑我在实际数组中添加的贴图外观。是因为我不喜欢终止每一行吗 这是我遇到问题的功能: char** readMap(char* map_to_read,int h, int w){ FILE* fp; i

所以基本上我正在用C编写一个基于文本的rpg,我想创建一个地图系统。基本上,我遇到的问题是从如下文件中读取文本映射:

----------\n
|c  x    [\n
|   x    |\n
]        |\n
----------\0
它基本上是使用二维阵列构建的*编辑我在实际数组中添加的贴图外观。是因为我不喜欢终止每一行吗

这是我遇到问题的功能:

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;
}
因为fgets并没有读取EOL,所以所有内容都可以一直读到最后。这是printf从内部看起来的样子:

我能再做一双眼睛吗?

分析 w的值是多少?对于显示的数据,换行符应至少为12个字符,换行符为10个字符,换行符为空。稍后您将遇到问题,因为您无法安全地返回本地数组map\u return,但这是一个单独的bug。此外,您应该在map_return[a][b]=fgetsc,w,fp上获得类型不匹配警告;行,因为map_返回[a][b]是一个字符,而fgets返回一个字符*。如果你要保存一个指向freec的指针,你就负担不起freec。这里有很多问题

你回答说:

基本上它是数组[h][w],因此w表示数组中一行中的元素数

得到进一步回应的是:


因此,您需要两个独立的内存块。一个用于读取行并验证它。它可以是简单的字符行[128];。然后使用if fgetsline、sizeofline、fp==0{…process EOF/error…}。假设通过了验证,则验证该行,当它通过验证时,可以安排将该行中最多w个字符复制到map_返回数组中。您必须决定是否正在播放以“\0”结尾的字符串。你可以为任何一个提出理由。然后必须处理“不返回局部变量”的问题

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

此代码已编译,但尚未运行。它没有在它读到的行上做太多验证;你可以决定还要做什么

#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;
}

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

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

w的值是多少?对于显示的数据,换行符应至少为12个字符,换行符为10个字符,换行符为空。稍后您将遇到问题,因为您无法安全地返回本地数组map\u return,但这是一个单独的bug。此外,您应该在map_return[a][b]=fgetsc,w,fp上获得类型不匹配警告;行,因为map_返回[a][b]是一个字符,而fgets返回一个字符*。如果你要保存一个指向freec的指针,你就负担不起freec。这里有很多问题…基本上是它的数组[h][w],所以w代表数组中一行中的元素数量。是的,我注意到了,但如果我在工作,我只想让它正确阅读。所以你需要两块独立的内存。一个用于读取行并验证它。它可以是简单的字符行[128];。然后使用if fgetsline、sizeofline、fp==0{…process EOF/error…}。假设通过了验证,则验证该行,当它通过验证时,可以安排将该行中最多w个字符复制到map_返回数组中。您必须决定是否正在播放以“\0”结尾的字符串。你可以为任何一个提出理由。然后必须处理“不返回局部变量”的问题。我注意到了,但如果我在工作,我只是想让它正确阅读-你注意到了警告,但忽略了它,让它工作?我建议你立即改变你的习惯。。。注意编译器在你耳边尖叫你做错了什么,然后看看还有什么需要修复。是的,你是对的。当时我有点沮丧,因为我已经工作了好几个小时了。我来画地图,你先回来。那么,更好的解决方案是传递map_return的指针吗?
int h = 5;
int w = 10;
char map[h][w];

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