Intereting Posts
Напишите «сложные» структуры на FIFO Макрос S_ISREG не определен использование malloc в программах contiki Неверный старый размер realloc Возврат нажатой клавиши без ввода для подтверждения Какой порядок для gcc связывать неразрешенный символ в статической библиотеке Как писать или читать память, не касаясь кеша gethostbyname в C Запись целочисленных значений в файл в двоичном формате с использованием C Как читать .exe в c Является ли адрес загрузки во время компиляции местом для копирования исполняемого файла в ОЗУ? Что такое заполнитель sscanf для типов uint8_t? Как определить, когда звук закончил воспроизведение при использовании PlaySound в Win32 SDK? Почему я не могу связать смешанную статическую библиотеку C / C ++ с интерфейсом C с использованием gcc? regex на языке C с использованием функций regcomp и regexec переключает между первым и вторым совпадением

распечатать на экране с приложения-консоли c, переписывающего текущую строку

Я хочу перезаписать текущую строку в консольной программе 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 для этого. Вместо того, чтобы перезаписать текущую строку, напишите во второй экранный буфер. После того, как вы полностью заполняете второй буфер, сделайте его активным буфером. Затем очистите исходный буфер экрана и используйте его для следующего кадра отображения и т. Д. И т. Д.