Я хочу перезаписать текущую строку в консольной программе ac, чтобы добиться вывода, например, в командной строке linux shell. Если возможно, метод должен работать под windowsми и linux.
while (i < 100) { i++; sprintf(cTmp, "%3d", i); puts(cTmp); if ((character = mygetch()) == 'q') { break; } }
Я бы хотел перезаписать предыдущий номер на каждой итерации и, если возможно, посмотреть, вводит ли пользователь символ без приостановки цикла. Если пользователь нажимает клавишу «q», цикл должен немедленно останавливаться.
Для этого вам необходимо получить доступ к терминалу. Самый простой способ сделать это – это библиотека, подобная ncurses . Кажется, есть версия, которая поддерживает и Windows.
С ncurses вы можете дать координаты для вывода строки, например:
mvprintw(row, col, "%s", text);
Вам не нужны ncurses
если это все, что вы делаете. Все, что вам нужно сделать, – переместить курсор в начало строки и перезаписать то, что там, и обязательно очистить выходной буфер, потому что stdout
обычно буферизируется по строке, если он подключен к терминалу. Вот пример:
#include #include int main(int argc, char *argv[]) { int i; for (i = 0; ; ++i) { printf("\rIteration %d", i); fflush(stdout); usleep(250000); } }
Символ возврата каретки, '\r'
, перемещает курсор в начало текущей строки. Если вы хотите сделать что-то более интересное, используйте библиотеку ncurses
.
Я не знаю, будет ли это работать в Windows, консоль Windows немного страннее по сравнению с большинством других ОС.
Вы должны использовать что-то вроде SetConsoleCursorPosition для управления курсором консоли. Переместите курсор в начало строки, перепишите всю строку с пробелами, а затем переместите курсор обратно в начало. Вы можете даже обернуть это функцией «clear_line ()» для удобства использования.
Вы также можете использовать SetConsoleActiveScreenBuffer для этого. Вместо того, чтобы перезаписать текущую строку, напишите во второй экранный буфер. После того, как вы полностью заполняете второй буфер, сделайте его активным буфером. Затем очистите исходный буфер экрана и используйте его для следующего кадра отображения и т. Д. И т. Д.