C fgets未读取EOL?
所以基本上我正在用C编写一个基于文本的rpg,我想创建一个地图系统。基本上,我遇到的问题是从如下文件中读取文本映射: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
----------\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...