Programm mit .txt-Datei steuern

Hallasas

Erfahrenes Mitglied
Hallo, ich bins mal wieder...
Ich habe eine Frage:
Ich möchte einen string aus einer Textdatei auslesen, und dem entsprechend handeln.
z.B.
test.txt
Code:
message 1

Nun sollte eine MessageBox erscheinen...

Code:
message 0

Nun sollte nichts passieren.

Ich freue mich über eure Hilfe
Gruß Hallasas
 
Code:
HANDLE hFile;
hFile = CreateFile("test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
   {
       MessageBox(NULL, "File not found", "ERROR", MB_OK);
   }

if (hFile != INVALID_HANDLE_VALUE)
   {
       DWORD dwFileSize;
       dwFileSize = GetFileSize(hFile, NULL);
       if (dwFileSize != 0xFFFFFFFF)
          {
              char buffer1[dwFileSize + 1];
              DWORD dwRead;
              ReadFile(hFile, buffer1, dwFileSize, &dwRead, NULL);
              buffer1[dwFileSize] = '\0';
              if(buffer1 == "wasauchimmerdadrinstehensoll")
                {
                     MessageBox(NULL, "Was auch immer du zu sagen hast", "Nachricht", MB_OK);
                }
              else if(buffer1 == "wasauchimmerdasonstdrinstehensoll")
                {
                     MessageBox(NULL, "Was auch immer du sonst zu sagen hast", "Nachricht", MB_OK);
                }
              else
                {
                     // machen wir gar nichts
                }
          }
   }
CloseHandle(hFile);
 
Erstmal vielen Dank für die schnelle Antwort, aber ich habe das noch nicht so richtig verstanden.
Hier willst du die Existenz der Datei nachweisen:
C++:
    HANDLE hFile;
    hFile = CreateFile("test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, "File not found", "ERROR", MB_OK);
    }

    if (hFile != INVALID_HANDLE_VALUE)
    {

Hier wirst du wahrscheinlich nach der Größe der Datei schauen:
C++:
        DWORD dwFileSize;
        dwFileSize = GetFileSize(hFile, NULL);
        if (dwFileSize != 0xFFFFFFFF)
        {

Und nun liest du sie ein:
C++:
              char buffer1[dwFileSize + 1];
              DWORD dwRead;
              ReadFile(hFile, buffer1, dwFileSize, &dwRead, NULL);
              buffer1[dwFileSize] = '\0';

Aber wie soll nun die "Test.txt" aussehen?
Bisher habe ich nur die MessageBox erhalten, wenn die Datei nicht existiert...

Ich habe auch natürlich das hineingeschrieben:
Code:
wasauchimmerdadrinstehensoll

Nur wurde keine MessageBox ausgegeben.

Ich würde mich freuen, wenn du mir hilfst.
Gruß Hallasas
 
Zuletzt bearbeitet von einem Moderator:
Wenn was nicht funktioniert, ist es immer ganz hilfreich, sich einfach das Ergebnis ohne Bedingungen anzuschauen

Code:
HANDLE hFile;
hFile = CreateFile("test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
   {
       MessageBox(NULL, "File not found", "ERROR", MB_OK);
   }

if (hFile != INVALID_HANDLE_VALUE)
   {
       DWORD dwFileSize;
       dwFileSize = GetFileSize(hFile, NULL);
       if (dwFileSize != 0xFFFFFFFF)
          {
              char buffer1[dwFileSize + 1];
              DWORD dwRead;
              ReadFile(hFile, buffer1, dwFileSize, &dwRead, NULL);
              buffer1[dwFileSize] = '\0';
              MessageBox(NULL, buffer1, "Inhalt der Datei", MB_OK);
          }
   }
CloseHandle(hFile);

Das zeigt dir genau an, was aus der Datei gelesen wurde, und du kannst danach im Umkehrschluss deine if abfragen machen
Einzige Stolperfalle ist es, wenn am Ende der Datei noch eine Leerstelle oder Zeilenschaltung steht, aber auch das kann man prüfen ohne überhaupt in die Datei schauen zu müssen

Mal angenommen in der Datei soll stehen "Dies ist ein Test"

Code:
char buffer2 [18] = "Dies ist ein Test\0";

if (buffer1 != buffer2)
   {
       MessageBox(NULL, "Inhalt ist nicht gleich, "ERROR", MB_OK);
   }

if (strlen(buffer1) != strlen(buffer2))
   {
       MessageBox(NULL, "Länge ist nicht gleich, "ERROR", MB_OK);
   }
 
Ein Fehler den viele machen ist auch der Gültigkeitsbereich einer Variable

Code:
HANDLE hFile;
hFile = CreateFile("test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
   {
       MessageBox(NULL, "File not found", "ERROR", MB_OK);
   }

if (hFile != INVALID_HANDLE_VALUE)
   {
       DWORD dwFileSize;
       dwFileSize = GetFileSize(hFile, NULL);
       if (dwFileSize != 0xFFFFFFFF)
          {
              char buffer1[dwFileSize + 1];   // hier wird buffer 1 definiert
              DWORD dwRead;
              ReadFile(hFile, buffer1, dwFileSize, &dwRead, NULL); // hier wird buffer1 gefüllt
              buffer1[dwFileSize] = '\0';
              MessageBox(NULL, buffer1, "Inhalt der Datei", MB_OK);   // hier wird der Inhalt ausgegeben
          }
       // an dieser Stelle existiert buffer1 bereits nicht mehr
   }
CloseHandle(hFile);

// an dieser Stelle existiert von der gesamten Information aus der Datei gar nichts mehr, kein Inhalt, kein Dateiname, kein filesize
 
Das funktioniert zwar, doch wollte ich nicht den Inhalt der Datei ausgeben, sondern je nach Inhalt der Datei handeln.
Bei der Variable "message" geht es um den Wert, der nach der Variable folgt...
Dies währe in meinem Fall eine "1" oder eine "0".
z.B.
Code:
meinevariable 1

Ich hoffe, du kannst mir helfen.
Gruß Hallasas
 
Also zuerstmal kannst du in dem Fall den Inhalt der Datei auf den Wert der Variablen selbst beschränken, also steht in der Datei nur noch 0 oder 1, ohne Leerstellen, ohne Zeilenumbruch ohne sonstwas

Die Ausgabe der Datei dient nur zur Überprüfung, weil du gesagt hast es geht nicht

Wenn du schreibst:

if(buffer1 == "meinevariable 1")
{
MessageBox(irgendwas);
}

und es erscheint keine Messagebox, trotzdem in der Datei "meinevariable 1" steht, dann kann es ausschliesslich daran liegen, dass der Inhalt der Datei trotzdem nicht mit der Abfrage übereinstimmt, sprich es steht ausserdem noch was anderes drin, z.B. eine Leerstelle oder ein Zeilenumbruch, also lässt du dir den Inhalt der Datei anzeigen, um zu überprüfen, wo da der Unterschied ist und hast du den Unterschied mal gefunden kannst du es berichtigen
 
Ich muss mich entschuldigen, es war ein syntaktischer Fehler meinerseits...
Nur funktioniert dies bei mir nicht:
C++:
char buffer2 [19] = "Dies ist ein Test\0";
if (buffer1 != buffer2)
{
        MessageBox(NULL, "Inhalt ist nicht gleich", "ERROR", MB_OK);
}

if (strlen(buffer1) != strlen(buffer2))
{
        MessageBox(NULL, "Länge ist nicht gleich", "ERROR", MB_OK);
}
Ich musste die Größe von "buffer2" um eins erhögen, da ich sonst den Fehler:
Code:
error: initializer-string for array of chars is too long
bekomme. Daraus folgt, dass mir jedes Mal die Fehlermeldung "Inhalt ist nicht gleich" wiedergegeben wird.

Vieleicht könntest du auch mir auch bei diesem Problem helfen...
Gruß Hallasas
 
Zuletzt bearbeitet von einem Moderator:
Ich persönlich mag die Art und Weise auch nicht, wie C mit strings umgeht, 0 terminiert und vorgegebene Länge, da passiert es mir selbst auch dauernd, dass ich den buffer 1 zu lang oder 1 zu kurz habe
Auch kann ich mir nie merken, wann man die \0 hinten mit angeben muss und wann nicht

Dazu empfehle ich ein Anfänger Tutorial zum Thema C strings
Meine persönliche Lösung ist, ich konvertiere mir alles zu std:string, damit habe ich die ganzen Probleme von Anfang an nicht und kann speziell bei solchen Fehlern wie du gerate hast ohne grossen Aufwand rausfinden wo der Fehler liegt

Code:
#include <string>

HANDLE hFile;
hFile = CreateFile("test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
   {
       MessageBox(NULL, "File not found", "ERROR", MB_OK);
   }

if (hFile != INVALID_HANDLE_VALUE)
   {
       DWORD dwFileSize;
       dwFileSize = GetFileSize(hFile, NULL);
       if (dwFileSize != 0xFFFFFFFF)
          {
              char buffer1[dwFileSize + 1];
              DWORD dwRead;
              ReadFile(hFile, buffer1, dwFileSize, &dwRead, NULL);
              buffer1[dwFileSize] = '\0';
              MessageBox(NULL, buffer1, "Inhalt der Datei", MB_OK);
              std::string myBuffer(buffer1);
              std::string myContent = "Dies ist ein Test";
              if(myBuffer != myContent)
                {
                       std::string myResult = "buffer1: " + myBuffer + " ist nicht gleich myContent " + myContent;
                       if(myBuffer.length() > myContent.length())
                         {
                               myResult = myResult + "\n\nbuffer1 ist länger als myContent";
                         }
                       else if(myBuffer.length() < myContent.length())
                         {
                               myResult = myResult + "\n\nbuffer1 ist kürzer als myContent";
                         }
                       else
                         {
                               myResult = myResult + "\n\nDer Text stimmt nicht überein";
                         }
                      MessageBox(NULL, myResult.c_str(), "Ergebnis", MB_OK);
                }
              if(myBuffer == myContent)
                {
                      MessageBox(NULL, "Inhalt stimmt überein, "Ergebnis", MB_OK);
                }
          }
   }
CloseHandle(hFile);
 
Zurück