Обновление текста, отображаемого на терминале

Я пытаюсь создать программу игры в жизнь на C, но я не очень хорошо знаком с процессом обновления вывода, отображаемого на терминале.

Так, например, у меня будет массив 2d char, где каждый элемент будет содержать либо «#», либо «-». Я буду печатать этот массив на экране, но вместо того, чтобы печатать новый массив 2d каждый раз, когда происходит изменение состояния, я хочу перезаписать старый массив в терминале новым состоянием.

Я искал способы сделать это, но мне не повезло. Самое близкое, что я нашел, это возврат каретки в функции printf (\r), но, надеюсь, кто-нибудь подскажет, как это сделать лучше всего.

В частности, как я мог распечатать 2d-массив на экране, изменить элементы массива и распечатать новый массив ПОВЕРХ старого, т.е. перезаписать его.


person syco_link    schedule 21.04.2014    source источник
comment
У вас есть конкретный вопрос?   -  person this    schedule 22.04.2014
comment
я обновил вопрос   -  person syco_link    schedule 22.04.2014
comment
Что ты имеешь в виду под словом сверху?   -  person this    schedule 22.04.2014
comment
Windows, Linux, iOS...?   -  person ryyker    schedule 22.04.2014
comment
Извините, платформа Linux   -  person syco_link    schedule 22.04.2014
comment
Хорошо, вы видите что-нибудь в любом из ответов, опубликованных до сих пор? Некоторая обратная связь по этим комментариям и/или ответам была бы хорошей. Таким образом, если мы пропустим отметку, вы можете сообщить нам, где.   -  person ryyker    schedule 22.04.2014


Ответы (2)


(некоторые из этих ссылок и фрагментов кода относятся к Linux, а другие — к Windows)
С учетом ваших конкретных вопросов (и при условии, что вы знаете, как записать массив в консоль):

1) запишите первый массив.
2) Затем очистите консоль (или над написать консоль)
Примерно так:

#include <stdlib.h>

void main()
{
   system("cls");
}     

Или напишите в стандартный вывод следующее: (Linux)

write(1,"\E[H\E[2J",7);

это то, что делает /usr/bin/clear, за исключением того, что он не создает другой процесс.
Или и то, и другое:

 void clear_screen()
 {
  #ifdef WINDOWS
     system ( "CLS" );
  #else
     // Assume POSIX
     system ( "clear" );
  #endif
 }  

Дополнительные параметры здесь

3) записать следующий массив

person ryyker    schedule 21.04.2014
comment
Рюикер, извините, что не прокомментировал раньше, был на работе. Похоже, это может быть именно то, что я искал! Я попробую это позже и отмечу решение, если все хорошо. Спасибо :) - person syco_link; 22.04.2014
comment
@syco_link - Да, эта работа иногда мешает. - person ryyker; 22.04.2014
comment
Отлично очистил экран, именно то, что мне нужно! Есть ли шанс, что вы могли бы объяснить выражение в функции записи или указать мне на какую-нибудь документацию для нее? Благодарю вас! - person syco_link; 23.04.2014
comment
Найдите \EH\E[2J [ЗДЕСЬ. По сути, это сценарии оболочки. На нем много написано, очень полезно. - person ryyker; 23.04.2014

Вы можете попробовать что-то вроде этого:

#include<stdio.h>

int main(void)
{

printf ("#####-----\r");
printf ("-#####----\r");

}

Не уверен, что действительно ответил на ваш вопрос. И если это не ваш ответ, то вы определенно ищете что-то вроде ncurses.

person bubble    schedule 21.04.2014
comment
Извините, массив 2d, поэтому на терминале может быть сетка 10 x 10. Насколько я знаю, \r будет иметь дело только с одной строкой и не более, но я посмотрю на ncurses, спасибо! - person syco_link; 22.04.2014