如何从文件中加载二维字符数组并使用 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();

偏移量仅用于使地图居中(将来),因此您可以忽略它们。

我的实际打印是这样的:

而且我真的不知道问题出在哪里。

如果有任何帮助,我将不胜感激。 谢谢你

【问题讨论】:

能否提供可编译的完整代码?您的代码缺少某些变量的定义和/或赋值,例如xMaxyMax。此外,请以文字形式发布地图文件的内容,不要以图片形式发布。 【参考方案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() 打印它?的主要内容,如果未能解决你的问题,请参考以下文章

在 MicroPython 中,如何从字符串中加载模块

如何将非通用排序列表保存到文件中,以便可以从文件中加载该排序列表?

UITableViewCell 如何知道从数组或字典中加载啥 JSON

从 PHP 中加载 .sql 文件

从 PHP 中加载 .sql 文件

从一个巨大的(> 200MB)数组文件中加载随机对象而不加载整个数组