#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. Отличный совет, чувак. Спасибо вам 🙂