Como posso replace a mesma parte do console em um aplicativo de console C ++ nativo do Windows, sem usar uma biblioteca de terceiros?

Eu tenho um aplicativo de console que precisa exibir o estado dos itens, mas ao invés de ter o texto de rolagem como louco eu prefiro ver o status atual continuar aparecendo nas mesmas linhas. Por exemplo:

Running... nn% complete
Buffer size: bbbb bytes

deve ser a saída, em que ‘nn’ é a porcentagem atual concluída e ‘bbbb’ é um tamanho de buffer, atualizado periodicamente nas mesmas linhas do console.

A primeira abordagem que eu tirei simplesmente imprimiu o número correto de backspaces no console antes de imprimir o novo estado, mas isso tem uma cintilação desagradável da qual eu quero me livrar. Eu também quero me ater à biblioteca padrão ou à funcionalidade fornecida pela MS (VC 8) para não introduzir outra dependência para essa necessidade simples.

Você pode usar SetConsoleCursorPosition . Você precisará chamar GetStdHandle para obter um identificador para o buffer de saída.

Joseph, JP e CodingTheWheel forneceram ajuda valiosa.

Para o meu caso simples, a abordagem mais direta parecia basear-se na resposta da CodingTheWheel :

 // before entering update loop HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO bufferInfo; GetConsoleScreenBufferInfo(h, &bufferInfo); // update loop while (updating) { // reset the cursor position to where it was each time SetConsoleCursorPosition(h, bufferInfo.dwCursorPosition); //... // insert combinations of sprintf, printf, etc. here //... } 

Para problemas mais complicados, a API do console completo, conforme fornecida pela resposta do JP , em coordenação com os exemplos fornecidos pelo link da resposta de Joseph pode ser útil, mas achei o trabalho necessário para usar o CHAR_INFO muito tedioso para um aplicativo tão simples.

Se você imprimir usando \ r e não usar uma function que irá gerar uma nova linha ou adicionar \ n ao final, o cursor voltará para o início da linha e apenas imprimirá a próxima coisa que você colocar. A geração da sequência completa antes da impressão pode reduzir também a cintilação.

UPDATE : A questão foi alterada para 2 linhas de saída em vez de 1, o que faz com que minha resposta não seja mais completa. Uma abordagem mais complicada é provavelmente necessária. JP tem a ideia certa com a API do console . Acredito que o site a seguir detalha muitas das coisas que você precisará para atingir seu objective. O site também menciona que a chave para reduzir o flicker é renderizar tudo fora da canvas antes de exibi-lo. Isso é verdade sempre que você estiver exibindo algo na canvas, seja texto ou charts (2D ou 3D).

http://www.benryves.com/tutorials/?t=winconsole

Caso a sugestão do Joseph não dê flexibilidade suficiente, dê uma olhada na API do console: http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx .

No Linux, você pode fazer isso imprimindo \ b e / ou \ r para stderr. Pode ser necessário experimentar para encontrar a combinação certa de coisas no Windows.