freaktastisch
Goto Top

Über C++ Konsoleninhalt abfragen

Hey zusammen,

ich hab jetzt etwas gesucht aber nichts gefunden. Wie kann ich in C++ abfragen, ob die Konsole voll ist, also die aktuelle Seite? Es soll eine Liste angezeigt werden mit 255 Einträgen aber immer nur soweit das die Seite voll wird und der User muss dann <Enter> um fortzufahren.

Wie immer, danke für die Antworten. Und Entschuldigt meine etwas niedrigen Kenntnisse :/

Gruß Dominic

Content-Key: 334940

Url: https://administrator.de/contentid/334940

Printed on: April 25, 2024 at 21:04 o'clock

Member: rubberman
rubberman Apr 12, 2017 at 10:43:20 (UTC)
Goto Top
Hallo Dominic,

grundsätzlich ist für so etwas nichts im C++ Standard vorgesehen. Das Konsolefenster ist Sache der Implementierung. Heißt, du musst plattformspezifisch werden (z.B. Windows API oder POSIX). Von welchem Betriebssystem reden wir denn?

Grüße
rubberman
Member: freaktastisch
freaktastisch Apr 12, 2017 at 11:56:45 (UTC)
Goto Top
Oh stimmt, sorry mein Fehler
Ich bin hier auf Windows 10 unterwegs

Gruß Dominic
Member: rubberman
rubberman Apr 12, 2017 updated at 19:41:09 (UTC)
Goto Top
Windows

OK, dann etwa so:
#include <iostream>
#include <string>

#ifdef UNICODE
# undef UNICODE
#endif
#ifdef _WIN32_WINNT
# undef _WIN32_WINNT
#endif
#define _WIN32_WINNT 0x501
#define WIN32_LEAN_AND_MEAN
#define NOUSER
#define NOSERVICE
#define NOMCX
#define NOIME
#define NOKERNEL
#ifndef NOMINMAX
# define NOMINMAX
#endif
#include <windows.h>

unsigned ConsoleHeight()
{
  CONSOLE_SCREEN_BUFFER_INFO csbi = {0};
  GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
  return 1u + csbi.srWindow.Bottom - csbi.srWindow.Top;
}

void Prompt()
{
  const std::string prompt = "--- Fortsetzen mit ENTER --- ";  
  HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
  CONSOLE_SCREEN_BUFFER_INFO csbi = {0};
  std::string inp;

  GetConsoleScreenBufferInfo(hOut, &csbi); // ... um Cursorposition vor der Promptausgabe festzuhalten
  std::cout << prompt;
  std::getline(std::cin, inp);

  DWORD len = prompt.length() + inp.length(); // Länge der Ausgabe seit Aufruf der Funktion
  FillConsoleOutputCharacter(hOut, ' ', len, csbi.dwCursorPosition, &len); // Ausgabe mit Leerzeichen überschreiben  
  SetConsoleCursorPosition(hOut, csbi.dwCursorPosition); // Cursor an die Ausgangsposition zurücksetzen
}

int main()
{
  const unsigned maximum = 255u;

  unsigned height = ConsoleHeight() - 1u, // Höhe - 1, damit der Prompt noch darunter Platz hat.
           iterations = maximum / height, // Anzahl ganzer "Seiten" 
           start = 1u,
           stop = start + height;

  // ganze Seiten ausgeben
  for (unsigned i = 0; i < iterations; ++i)
  {
    for (unsigned j = start; j < stop; ++j)
      std::cout << j << std::endl;

    Prompt();

    start = stop;
    stop += height;
  }

  // restliche Zeilen ausgeben
  for (unsigned j = start; j <= maximum; ++j)
    std::cout << j << std::endl;


  return 0;
}

Hab einfach mal beispielhaft die Zahlen 1-255 runter geschrieben. Keine Ahnung was deine Liste tatsächlich enthält ...

Grüße
rubberman