Как загрузить массив 2D символов из файла и распечатать его с помощью mvprintw() в C с помощью ncurses.h?

#c #printf #fopen #ncurses #fgetc

#c #printf #открой #проклятия #fgetc

Вопрос:

Я пишу небольшую игру и решил загрузить карту из файла, но столкнулся с проблемой.Файл выглядит так :

введите описание изображения здесь

и мне нужно распечатать его так, как он есть в файле, ожидающем точек. Они должны быть пространствами. мой код для печати выглядит следующим образом :

 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 lt; height; row  ) {  for (int col = 0; col lt; 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;ilt;20;i  ){  offsetW=(xMax-width)/2;    for(int y=0;ylt;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(); }  

Смещения существуют только для центрирования карты (в будущем), так что вы можете их игнорировать.

Мой настоящий отпечаток выглядит так :

введите описание изображения здесь

И я действительно не могу сказать, в чем проблема.

Я был бы признателен за любую помощь. Спасибо

Комментарии:

1. Не могли бы вы предоставить полный компилируемый код? В вашем коде отсутствуют определения и/или назначения некоторых переменных, таких как xMax и yMax . Кроме того, пожалуйста, разместите содержимое файла карты в тексте, а не в виде картинки.

Ответ №1:

Поскольку файл карты содержит символ новой строки в конце строк, каждая строка содержит width 1 символы. Затем последовательный fgetc() считывает дополнительный байт для каждой строки и вызывает перекос в вертикальном выравнивании.

Обходным путем будет явное чтение символа новой строки, например:

 for (int row = 0; row lt; height; row  ) {  for (int col = 0; col lt; 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 lt; height; row  ) {  fgets(buf, BUFSIZ, mapfile); // read each line  for (int col = 0; col lt; width; col  ) {  ...  map[row][col]=buf[col]; // assign column values of the line  } }  

Комментарии:

1. Отличный совет, чувак. Спасибо вам 🙂