如何从文件中加载二维字符数组并使用 ncurses.h 在 C 中使用 mvprintw() 打印它?
Posted
技术标签:
【中文标题】如何从文件中加载二维字符数组并使用 ncurses.h 在 C 中使用 mvprintw() 打印它?【英文标题】:How to load 2D char array from file and print it with mvprintw() in C using ncurses.h? 【发布时间】:2022-01-05 22:37:27 【问题描述】:我正在编写一个小游戏,我决定从文件中加载地图,但我遇到了问题。文件如下所示:
我需要像在文件中的点一样打印它。它们必须是空格。 我的打印代码如下所示:
void printmap()
clear();
refresh();
FILE *mapfile;
int width=30;
int height=20;
char map[20][30];
mapfile = fopen(mapname, "r+");
for (int row = 0; row < height; row++)
for (int col = 0; col < width; col++)
mvprintw(0,0," ");
mvprintw(0,0,"%d %d",row,col);
refresh();
map[row][col]=fgetc(mapfile);
fclose(mapfile);
offsetW=(xMax-width)/2;
offsetY=((yMax-height)/2)-3;
printOffsetW = offsetW+23;
printOffsetY = offsetY+17;
for(int i=0;i<20;i++)
offsetW=(xMax-width)/2;
for(int y=0;y<width;y++)
if(map[i][y]=='#')
attron(COLOR_PAIR(1));
mvprintw(i,y,"#");
attroff(COLOR_PAIR(1));
else if(map[i][y]=='*')
attron(COLOR_PAIR(2));
mvprintw(i,y,"*");
attroff(COLOR_PAIR(2));
else if(map[i][y]==' '||map[i][y]=='.')
mvprintw(i,y," ");
offsetW++;
offsetY++;
mvprintw(printOffsetY,printOffsetW,"@");
refresh();
偏移量仅用于使地图居中(将来),因此您可以忽略它们。
我的实际打印是这样的:
而且我真的不知道问题出在哪里。
如果有任何帮助,我将不胜感激。 谢谢你
【问题讨论】:
能否提供可编译的完整代码?您的代码缺少某些变量的定义和/或赋值,例如xMax
和yMax
。此外,请以文字形式发布地图文件的内容,不要以图片形式发布。
【参考方案1】:
由于地图文件在行尾包含换行符,
每行包含width + 1
个字符。然后是顺序的fgetc()
为每一行读取额外的字节并导致垂直对齐的倾斜。
一种解决方法是显式读取换行符,例如:
for (int row = 0; row < height; row++)
for (int col = 0; col < width; col++)
...
map[row][col]=fgetc(mapfile);
fgetc(mapfile); // read the newline character and discard
或者更便携的方式:
char map[20][30];
char buf[BUFSIZ]; // line buffer
mapfile = fopen(mapname, "r+");
for (int row = 0; row < height; row++)
fgets(buf, BUFSIZ, mapfile); // read each line
for (int col = 0; col < width; col++)
...
map[row][col]=buf[col]; // assign column values of the line
【讨论】:
很好的建议。谢谢你:)以上是关于如何从文件中加载二维字符数组并使用 ncurses.h 在 C 中使用 mvprintw() 打印它?的主要内容,如果未能解决你的问题,请参考以下文章
如何将非通用排序列表保存到文件中,以便可以从文件中加载该排序列表?