Probleme mit char*



  • Hallo,

    ich habe folgendes Problem, ich möchte in einem Verzeichniss alle Dateien auslesen. Dazu benutze ich die Funktionen fopen, fread und fclose ich lasse den Inhalt in eine Char Array speichern. Dies alles geschiet in einer schleife, die sich beendet, sobald alle Dateien gelesen wurden.

    //Hier steht der aufruf der findfirst Funktion
          do
          {
                 char *text = new char[filesize.size + 1];
                 file = fopen(filename, "r");
                 fread(text, fd.size, 1, file);
                 text[fd.size] = '\0';
                 fclose(file);
                 printf("%s", text[i]);
                 delete text;
                 text = NULL;
              }
              done = _findnexti64(filehandle, &fd);
          }while (!done);
    

    Beim Ausgeben des Textes werden allerdings immer mehr Zeichen Ausgegeben als eigentlich in der Datei steht.
    Also wenn in der Datei z.B. steht:
    Hallo
    das
    ist
    ein
    Test

    Würde in der Ausgabe ungefähr so etwas stehen:
    Hallo
    das
    ist
    ein
    Test.T\Profile♣

    Kann mir jemand sagen, warum in dem text mehr steht als es sollte, obwohl ich den text mit \0 terminiert habe?

    Danke schon im voraus für euer Hilfe!



  • HabKeinen schrieb:

    char *text = new char[filesize.size + 1];
                 printf("%s", text[i]);
                 delete text;
    

    Sehr erstaunlich, dass überhaupt dein Text ausgegeben wird. text[i] ist ein char, und den gibst du mit %s aus ... geht schon in die Hose. delete text; ist auch falsch, Arrays müssen mit delete[] gelöscht werden. Dann wär da noch, dass die Dateigröße unter Windows im Textmodus nicht identisch ist mit der Summe aller Zeilenlängen plus Newlines, da ja noch Wagenrückläufe ('\r') unsichtbar eingefügt werden.



  • Das ist schon OK so mit dem Text[i] ich habe nur bevor ich den Source kopiert das ganze mit

    for (int i = 0; i < strlen(text); i++)
    {
         printf("%c", text[i]);
    }
    

    ausbropiert. Und das habe ich beim "rückgägigmachen" lediglich übersehen, ebenso ist es mit delete [] text das stammt auch noch von anderen versuchen. Das es so nicht klappt weiß ich schon. Aber trotzdem danke für den Hinweis.

    Wie kann man das denn schaffen, das der genau das ausgibt was in der Datei steht?



  • HabKeinen schrieb:

    Wie kann man das denn schaffen, das der genau das ausgibt was in der Datei steht?

    2 Möglichkeiten: a) Du bestehst darauf, die Datei im Textmodus zu öffnen (ideal für Textdateien *g*). Dann sollte es funktionieren, den Rückgabewert von fread auszuwerten. Der sollte gleich der Anzahl gelesener Elemente sein (Elemente sind von der Größe wie der 2. Parameter von fread angibt, dh du müßtest den 2. und den 3. vertauschen, sonst bekommst du hier immer 1).
    b) Du öffnest alle Dateien im Binärmodus. Dann ist das Problem weg. Dafür haben Textdateien überflüssige Wagenrückläufe drin.



  • Danke für deine Hilfe 👍


Anmelden zum Antworten