Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » ausgabepuffer der konsole in eine datei speichern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.09.2004, 15:50 Uhr
~chris182
Gast


Hi! Ich möchte ein program schreiben, dass den gesamten lesbaren teil des ausgabepuffers in eine datei schreibt. kann mir jemand weiterhelfen?

ich habe folgendes program gefunden, was sich einen teil des ausgabepuffers holt und in einem anderen ausgibt. Ich möchte es so ändern, das es den puffer in eine textdatei schreibt.

ich bin in dem program auf volgende variable gestoßen:
CHAR_INFO chiBuffer[320]; // [4][80];
ich glaube in ihr wird ein teil des ausgabepuffers abgelegt.

nur wie kan ich diese variable ausgeben oder in eine datei schreiben?
wenn ich das versuche gibt der comp seine standartmeldung aus: cannot convert CHAR_INFO to char oder so

Hier ist mal der volle Programcode er kopiert die ersten 4 zeilen des puffers:
(Das program funktioniert nur korekt, wenn schon vorher was im ausgabepuffer zu lesen ist)


C++:
#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>



int main(int argc, char *argv[])
{
HANDLE hStdout, hNewScreenBuffer;
    SMALL_RECT srctReadRect;
    SMALL_RECT srctWriteRect;
    CHAR_INFO chiBuffer[320]; // [4][80];
    COORD coordBufSize;
    COORD coordBufCoord;
    BOOL fSuccess;



    // Get a handle to the STDOUT screen buffer to copy from and
    // create a new screen buffer to copy to.

    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    hNewScreenBuffer = CreateConsoleScreenBuffer(
       GENERIC_READ |           // read/write access
       GENERIC_WRITE,
       0,                       // not shared
       NULL,                    // default security attributes
       CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE
       NULL);                   // reserved; must be NULL
    if (hStdout == INVALID_HANDLE_VALUE ||
            hNewScreenBuffer == INVALID_HANDLE_VALUE)
    {
        printf("CreateConsoleScreenBuffer failed (%d)\n", GetLastError());
        return(0);
    }

    // Make the new screen buffer the active screen buffer.

    if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) )
    {
        printf("SetConsoleActiveScreenBuffer failed (%d)\n", GetLastError());
        return(0);
    }

    // Set the source rectangle.

    srctReadRect.Top = 0;    // top left: row 0, col 0
    srctReadRect.Left = 0;   //das bedeutet fange in der oberen linken ecke an zu lesen
    srctReadRect.Bottom = 4; // zeilen einlesen
    srctReadRect.Right = 80; //zeichen einlesen

    // The temporary buffer size is 2 rows x 80 columns.

    coordBufSize.Y = 4; //zeilen werden ausgegeben    achtung! es kann nur soviel ausgegeben werden, wie auch eingelesen wird!
    coordBufSize.X = 80; //zeichen werden ausgegeben

    // The top left destination cell of the temporary buffer is
    // row 0, col 0.

    coordBufCoord.X = 0;
    coordBufCoord.Y = 0;

    // Copy the block from the screen buffer to the temp. buffer.

    fSuccess = ReadConsoleOutput(
       hStdout,        // screen buffer to read from
       chiBuffer,      // buffer to copy into
       coordBufSize,   // col-row size of chiBuffer
       coordBufCoord,  // top left dest. cell in chiBuffer
       &srctReadRect); // screen buffer source rectangle | fläche, die eingelesen werden soll
    if (! fSuccess)
    {
        printf("ReadConsoleOutput failed (%d)\n", GetLastError());
        return(0);
    }

    // Set the destination rectangle.

    srctWriteRect.Top = 0;    // top lt: row 10, col 0 schreibe die pufferdaten an diese position
    srctWriteRect.Left = 0;
    srctWriteRect.Bottom = 11; // bot. rt: row 11, col 79
    srctWriteRect.Right = 79;

    // Copy from the temporary buffer to the new screen buffer.

    fSuccess = WriteConsoleOutput(
        hNewScreenBuffer, // screen buffer to write to
        chiBuffer,        // buffer to copy from
        coordBufSize,     // col-row size of chiBuffer
        coordBufCoord,    // top left src cell in chiBuffer
        &srctWriteRect);  // dest. screen buffer rectangle
    if (! fSuccess)
    {
        printf("WriteConsoleOutput failed (%d)\n", GetLastError());
        return(0);
    }
    Sleep(1000);
system("PAUSE");
    // Restore the original active screen buffer.

    if (! SetConsoleActiveScreenBuffer(hStdout))
    {
        printf("SetConsoleActiveScreenBuffer failed (%d)\n", GetLastError());
        return(0);
    }



return(0);
}




Bearbeitung von typecast:
cpp-Tags sind doch schon was schoenes

Dieser Post wurde am 21.09.2004 um 22:09 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.09.2004, 16:00 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Es müsste reichen wenn du dir mit CreateFile ne Datei erstellst und das Handle dann an SetStdHandle übergibst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.09.2004, 17:11 Uhr
~chris182
Gast


Es funktioniert nicht. Das Prog. kopiert noch fleißig die Buffers. Und es wird eine Datei erstellt. Allerdings ist sie leer. Obwohl sich Daten im Buffer befanden.
Hier ist es nochmal: ganz unten ist die CreateFile funktion.


C++:

#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>



int main(int argc, char *argv[])
{

HANDLE hStdout, hNewScreenBuffer;
    SMALL_RECT srctReadRect;
    SMALL_RECT srctWriteRect;
    CHAR_INFO chiBuffer[320]; // [4][80];
    COORD coordBufSize;
    COORD coordBufCoord;
    BOOL fSuccess;



    // Get a handle to the STDOUT screen buffer to copy from and
    // create a new screen buffer to copy to.

    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    hNewScreenBuffer = CreateConsoleScreenBuffer(
       GENERIC_READ |           // read/write access
       GENERIC_WRITE,
       0,                       // not shared
       NULL,                    // default security attributes
       CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE
       NULL);                   // reserved; must be NULL
    if (hStdout == INVALID_HANDLE_VALUE ||
            hNewScreenBuffer == INVALID_HANDLE_VALUE)
    {
        printf("CreateConsoleScreenBuffer failed (%d)\n", GetLastError());
        return(0);
    }

    // Make the new screen buffer the active screen buffer.

    if (! SetConsoleActiveScreenBuffer(hNewScreenBuffer) )
    {
        printf("SetConsoleActiveScreenBuffer failed (%d)\n", GetLastError());
        return(0);
    }

    // Set the source rectangle.

    srctReadRect.Top = 0;    // top left: row 0, col 0
    srctReadRect.Left = 0;   //das bedeutet fange in der oberen linken ecke an zu lesen
    srctReadRect.Bottom = 4; // zeilen einlesen
    srctReadRect.Right = 80; //zeichen einlesen

    // The temporary buffer size is 2 rows x 80 columns.

    coordBufSize.Y = 4; //zeilen werden ausgegeben    achtung! es kann nur soviel ausgegeben werden, wie auch eingelesen wird!
    coordBufSize.X = 80; //zeichen werden ausgegeben

    // The top left destination cell of the temporary buffer is
    // row 0, col 0.

    coordBufCoord.X = 0;
    coordBufCoord.Y = 0;

    // Copy the block from the screen buffer to the temp. buffer.

    fSuccess = ReadConsoleOutput(
       hStdout,        // screen buffer to read from
       chiBuffer,      // buffer to copy into
       coordBufSize,   // col-row size of chiBuffer
       coordBufCoord,  // top left dest. cell in chiBuffer
       &srctReadRect); // screen buffer source rectangle | fläche, die eingelesen werden soll
    if (! fSuccess)
    {
        printf("ReadConsoleOutput failed (%d)\n", GetLastError());
        return(0);
    }

    // Set the destination rectangle.

    srctWriteRect.Top = 0;    // top lt: row 10, col 0 schreibe die pufferdaten an diese position
    srctWriteRect.Left = 0;
    srctWriteRect.Bottom = 11; // bot. rt: row 11, col 79
    srctWriteRect.Right = 79;

    // Copy from the temporary buffer to the new screen buffer.

    fSuccess = WriteConsoleOutput(
        hNewScreenBuffer, // screen buffer to write to
        chiBuffer,        // buffer to copy from
        coordBufSize,     // col-row size of chiBuffer
        coordBufCoord,    // top left src cell in chiBuffer
        &srctWriteRect);  // dest. screen buffer rectangle
    if (! fSuccess)
    {
        printf("WriteConsoleOutput failed (%d)\n", GetLastError());
        return(0);
    }
    Sleep(1000);

    // Restore the original active screen buffer.

    if (! SetConsoleActiveScreenBuffer(hStdout))
    {
        printf("SetConsoleActiveScreenBuffer failed (%d)\n", GetLastError());
        return(0);
    }


//öffnet/erstellt eine datei...

HANDLE hFile;

hFile = CreateFile(TEXT("myfile.txt"),     // file to create
                   GENERIC_WRITE,          // open for writing
                   0,                      // do not share
                   NULL,                   // default security
                   CREATE_ALWAYS,          // overwrite existing
                   FILE_ATTRIBUTE_NORMAL | // normal file
                   FILE_FLAG_OVERLAPPED,   // asynchronous I/O
                   NULL);                  // no attr. template

if (hFile == INVALID_HANDLE_VALUE)
{
    printf("Could not open file (error %d)\n", GetLastError());
    return 0;
}

//schreibt in die datei...

#define BUFSIZE 4096

DWORD  dwBytesRead, dwBytesWritten, dwBufSize=BUFSIZE;
//schreibe den konsolenpuffer
WriteFile(hFile, chiBuffer, dwBytesRead,
                &dwBytesWritten, NULL);

return(0);
}




Bearbeitung:

Bitte mal CPP-Tags verwenden! dafür sind die schliesslich da!


Dieser Post wurde am 21.09.2004 um 22:03 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.09.2004, 22:05 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


schliess mal die datei am ende, vorher wird die wahrscheinlich nicht geflusht, d.h deine WriteFile-Daten landen in der Tonne und nicht in deiner Datei

achja,
hat deine Konsole in dem angegebenen bereich überhaupt daten?
--
class God : public ChuckNorris { };

Dieser Post wurde am 21.09.2004 um 22:06 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.09.2004, 15:22 Uhr
~chris182
Gast


Leider klappts immer noch nicht.

Die Konsole hat im angegebenen bereich daten. das erkennt man daran, das etwas im neu erstellten puffer ausgegeben wird.


Aber mir ist da noch was komisches aufgefallen.
Wenn ich das prog mit einem doppelclick starte, erscheint im selben ordner die datei myfile.txt
das ist ja auch in ordnung und natürlich ist sie lehr, da das prog selber keine ausgabe macht.

deshalb starte ich die konsole und ziehe das prog per drag and drop hinein.
nur wird beim ausführens des progs die datei myfile.txt im ordner "CDokumente und Einstellungen\meinusername" abgelegt und nicht im ordner vom program selbst. warum? und wie kann man das ändern?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.09.2004, 21:17 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ah ich hab deinen fehler!
du benutzt dwBytesRead in WriteFile welches aber uninitialisiert ist!


Bearbeitung:

Hmm, was mir auffällt, WriteFile gibt 0 zurück, GetLastError dann 87, was bedeutet "Falscher Parameter" Nur schade das es nichts genaueres sagt *grml*


--
class God : public ChuckNorris { };

Dieser Post wurde am 22.09.2004 um 21:34 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.09.2004, 21:46 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ok du hattest mit FILE_FLAG_OVERLAPPED geöffnet, beim Overlapped-Param von WriteFile aber NULL übergeben. So funzt es so wie du es willst:


C++:
  //...

  HANDLE hFile;
  hFile = CreateFile("myfile.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  if(hFile == INVALID_HANDLE_VALUE)
  {
    printf("Could not open file (error %d)\n", GetLastError());
    return 0;
  }

  char chBuffer[325];
  for(int z = 0, int y = 0, int x = 0; x < 320; x++, y++, z++)
  {
    chBuffer[y] = chiBuffer[x].Char.AsciiChar;
    chBuffer[y+1] = 0;
    if( z >= 79)
    {
      chBuffer[y+1] = '\n';
      y++;
      z = -1;
    }
  }

  DWORD  dwBytesRead, dwBytesWritten;
  dwBytesRead = 320;
  dwBytesWritten = 0;
  if(!WriteFile(hFile, chBuffer, dwBytesRead, &dwBytesWritten, NULL))
  {
    LPVOID lpMsgBuf;
    FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL );
    printf("Fehler beim Schreiben der Datei aufgetreten: %s", lpMsgBuf);
    LocalFree( lpMsgBuf );
  }
  CloseHandle(hFile);


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: