所以,基本上,我用C写了一个基于文本的rpg,我想创建一个地图系统。基本上,im有问题的函数是从如下文件中读取“文本地图”:
----------\n
|c x [\n
| x |\n
] |\n
----------\0它基本上是使用2d数组构建的。*EDIT我添加了映射在实际数组中的样子。是因为我不喜欢终止每一行
这是我有困难的功能:
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
我能再来一双眼睛看这个吗?
发布于 2013-04-01 05:09:30
分析
w中的值是多少?对于显示的数据,得到换行符至少应该是12 (10个字符、换行符和null)。稍后您会遇到问题,因为您不能(安全地)返回本地数组map_return,但这是一个单独的错误。另外,您应该在map_return[a][b] = fgets(c, w, fp);行上得到类型不匹配警告,因为map_return[a][b]是char,fgets()返回char *。如果你要保存一个指向free(c)的指针,你就买不起它了。这里有很多问题..。
你的答复是:
基本上它是
array[h][w],所以w表示数组一行中的元素数。
得到了进一步的回应:
所以你需要两块独立的记忆。一个用于读取行并对其进行验证。它可以是简单的
char line[128];。然后使用if (fgets(line, sizeof(line), fp) == 0) { ...process EOF/error...}。如果通过,则验证行,当行通过验证时,可以安排将行中的w字符复制到map_return数组中。您必须决定是否在使用字符串(以“\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;
}此代码假定您不在map数组中存储以空结尾的字符串。
示例呼叫:
int h = 5;
int w = 10;
char map[h][w];
if (mapRead("somefile", h, w, map))
...process initialized map...
else
...report failure...函数的错误报告是最小的;您可以根据需要对其进行改进。
发布于 2013-04-01 05:23:07
与其责怪fgets,不如看看你的逻辑。在内部循环中循环w次数,每次读取w字节.这是h*w*w字节总数。
https://stackoverflow.com/questions/15737589
复制相似问题