Problem beim einlesen von einem zeichen mit get()



  • Hi

    ich möchte gerne jedes einzelne Zeichen einer Datei einlesen um manuel zu prüfen wann ein trennstring erreicht ist!

    Leider klappt das nicht!

    fstream isEin;
    char zeichen[1];
    isEin.open(OpenDialog1->FileName.c_str(), ios::in);
    while(isEin.is_open() && isEin.good() && !isEin.eof())
    {
      isEin.get(zeichen,1);
      if(AnsiString(zeichen) != Form2->txtNewline->Text[0])
      {
        Line = Line + AnsiString(zeichen);
      }
    }
    

    Leider gibt es einen Fehler beim ausführen und in zeichen steht '\0' was läuft da schief?

    THX

    Dagsta



  • Hmm, der Quellcode sieht wenig nach WinAPI aus 😉



  • Dieser Thread wurde von Moderator/in cd9000 aus dem Forum WinAPI in das Forum Borland C++ Builder (VCL/CLX) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • dagsta schrieb:

    Leider gibt es einen Fehler beim ausführen und in zeichen steht '\0' was läuft da schief?

    "funktioniert nicht" ist keine fehlerbeschreibung... was für ein fehler tritt wo auf?
    wegen dem '\0' versuch es doch direkt mit AnsiString



  • habe den fehler gefunden:

    char zeichen;

    und isEin.get(zeichen);

    funktionieren



  • Interessiert dich die Erklärung wiesos vorher nicht funktioniert hat auch?



  • Wenn die jemand parat hat warum nicht 😉



  • Weil das, was du vorher verwendet hast ein Array war... ein Array mit einem Element...



  • Windoof schrieb:

    Weil das, was du vorher verwendet hast ein Array war... ein Array mit einem Element...

    Falsch. Das ist nicht der Grund. Aber schön das du auch was beigetragen hast. Es hat zwar eine Beteiligung aber taugt nicht als Erklärung.

    @dagsta: Was du da deklariert hattest (char foo[1]) war ein Char-Array welches nur ein Zeichen aufnehmen konnte. C-Strings brauchen aber immer <Anzahl Zeichen> + 1 Bytes um gespeichert zu werden, da ein C-String mit einem \0 (0x00) abgeschlossen werden muss. Dafür ist aber in einem 1 byte grossen Speicherbereich kein Platz.

    Das Problem war jetzt folgendes: Der Konstruktor von AnsiString den du mit AnsiString(foo) aufrufst, hat folgende Implementierungen:

    AnsiString(char *string);
    AnsiString(char character);
    

    Für den Compiler ist ein Array allerdings nichts weiter als ein Zeiger auf das erste Element des Arrays. In unserem Fall ist also ein char foo[1] kompatibel mit "char *string". Der Compiler sucht jetzt den passenden Konstruktor zusammen und findet ihn. Dieser geht aber davon aus einen C-String zu erhalten und sucht verzweifelt nach einem \0 das er dann irgendwo findet.

    Durch den Wechsel des Typs von char [] auf char wird nun der Konstruktor genommen der sich bewusst ist, dass das nur 1 Zeichen ist.

    Du siehst für dein Problem hätte es 2 Lösungen gegeben: Der Typenwechsel (hier sicher sinnvoll) oder die Erweiterung des Arrays auf 2 Elemente wobei das letzte Fix mit einem \0 initialisiert und nie mehr angetastet wird.

    -junix



  • [do_not_mention,_wrong_thread]
    @Tutorial: *LOL* *ROFL* Genial!
    [/do_not_mention,_wrong thread]

    @junix:

    Tut mir leid, aber vielleicht steh' ich ja auf der Leitung...
    Ein

    char foo[1];
    

    besteht doch aus 2 bytes: foo[0] und foo[1], oder? *brainwashed*



  • WOW Was für eine erklärung 😮

    Vielen Dank



  • @swordfish nein, das siehst du falsch.

    <type> <varname>[<numberofelements>]

    Deshlab ist der höchste Index auch immer <numberofelements>-1.

    -junix

    P.S:

    swordfish schrieb:

    [do_not_mention,_wrong_thread]
    @Tutorial: *LOL* *ROFL* Genial!
    [/do_not_mention,_wrong thread]

    häh?


Anmelden zum Antworten