Nullzeichen überspringen



  • http://de.wikipedia.org/wiki/Nullzeichen ...

    Also, ich programmiere ja noch nicht lange in C/C++, aber ich bin schon der Meinung dass man wissen sollte wie das \0 heißt... 😉

    Aber, was für ein Code soll ich denn posten?
    Wie man eine Datei in einer RichEdit lädt?

    AnsiString Dateipfad;
    
    Dateipfad = (OpenDialog->FileName);
    richedit->Lines->LoadFromFile(Dateipfad);
    

    Darum geht es sich ja eigentlich nicht wirklich. Es geht sich um ein "höheres" Problem (also was an C/C++ liegt und nicht an das laden der Datei in RichEdit).
    Wenn ein Nullzeichen, was in C als ein \0 dargestellt wird, vorkommt, wird es als Markierung für das Ende der Zeichenkette angesehen und deshalb hört er danach auf.
    Also

    abcdefghijk[b]\0[/b]mnopqrstuvwxyz
    

    Davon bekomme ich nur

    abcdefghijk
    

    weil danach das \0 kommt, was für ihn das Ende der Zeichenkette bedeutet.

    In der Datei steht übrigens nicht \0 sondern



  • Hallo

    Das Verhalten von LoadFromFile ist soweit korrekt, denn die RichEdit-Komponente ist für Textdateien gedacht. Ein '\0' hat in einer Textdatei nichts zu suchen, denn das wäre dann eine Binärdatei. Das so etwas nicht korrekt in einer Textkomponente geladen wird ist zu erwartet.

    Was hast du denn vor? Warum willst du ein Null-Zeichen in RichEdit einlesen? Verarbeitet werden kann es von RichEdit eh nicht, es würde spätestens beim nächsten Speichern aus der RichEdit-Komponente verschwinden.

    bis bald
    akari



  • akari schrieb:

    ... es würde spätestens beim nächsten Speichern aus der RichEdit-Komponente verschwinden.

    Oha, gut zu wissen, aber wie ich oben schon editiert habe, dort steht nicht \0 sondern das richtige Nullzeichen

    .
    Was ber zum selbigen hinausführen würde

    Ich hab damit sogesehen gar nichts vor, nur der Benutzer soll es auch angezeigt bekommen und es soll auch übernommen, also wieder gespeichert werden.
    Weiß jemand ob es mit SynEdit geht, ansonsten benutz ich dann SynEdit.
    Ich hab mir das eigentlich so schön vorgestellt wie in Scite, wo sowelche Zeichen schön in einen Block angezeigt werden.



  • Hallo

    Ich glaube du bringst da etwas durcheinander, und die Datei auch.
    Wenn in deiner Datei stehen würde

    a\0b
    

    würde das im RichEdit natürlich auch richtig angezeigt werden. Diese Zeichenfolge besteht aus den chars 'a', '\', '0', und 'b', also auch 4 Zeichen, 4 Byte. Beachte das ich \ doppelt verwende habe, um die korrekte Escape-Sequenz für den C++ Quellcode deutlich zu machen.

    Aber in deiner Datei steht (laut deiner Beschreibung) die Zeichenkette
    'a', '\0' und 'b', nur 3 Zeichen, 3 Bytes. Auch hier ist das '\0' eine Escape-Sequenz, das schon genannte Null-zeichen. Dieses ist nicht darstellbar (weder in TRichEdit, TEdit und auch nicht SynEdit) und signalisiert normalen String-Funktionen das Ende, was eben auch LoadFromFile stört.

    Offenbar ist das '\0' bei deiner Textdatei fälschlicherweise reingeraten, aber ein Fehler bei TRichEdit oder anderen Einlesefunktionen ist das nicht, eher ein Fehler der (selbstgeschriebenen) Speicherfunktion die diese Datei erstellt hat.

    bis bald
    akari



  • akari schrieb:

    Hallo

    Ich glaube du bringst da etwas durcheinander, und die Datei auch.
    Wenn in deiner Datei stehen würde

    a\0b
    

    würde das im RichEdit natürlich auch richtig angezeigt werden. Diese Zeichenfolge besteht aus den chars 'a', '\', '0', und 'b', also auch 4 Zeichen, 4 Byte. Beachte das ich \ doppelt verwende habe, um die korrekte Escape-Sequenz für den C++ Quellcode deutlich zu machen.

    Ja, das weiß ich ja, habe es ja auch extra ausprobiert, ich wollte es nur so mit \0 hinschreiben damit man meint was ich meine... 😉
    Dieses \0 ist ja die Darstellung für das Nullzeichen in C/C++ ...

    akari schrieb:

    Aber in deiner Datei steht (laut deiner Beschreibung) die Zeichenkette
    'a', '\0' und 'b', nur 3 Zeichen, 3 Bytes. Auch hier ist das '\0' eine Escape-Sequenz, das schon genannte Null-zeichen. Dieses ist nicht darstellbar und signalisiert normalen String-Funktionen das Ende, was eben auch LoadFromFile stört.

    Offenbar ist das '\0' bei deiner Textdatei fälschlicherweise reingeraten, aber ein Fehler bei TRichEdit oder anderen Einlesefunktionen ist das nicht, eher ein Fehler der (selbstgeschriebenen) Speicherfunktion die diese Datei erstellt hat.

    Also, in meiner Datei steht

    Text TEXT2
    

    Die Lücke zwischen den Text und TEXT2 ist das Nullzeichen... Deshalb wollte ich es lieber mit \0 darstellen...
    Wie auch gesagt, ist es anscheinend auch notwendig für den Drucker, da diese Datei ja die Befehle für den Drucker beinhaltet.



  • Hallo

    So langsam versteh ich das Problem...

    Aber da wirst du bei Standard-Komponenten wohl nicht weiterkommen. Alle erwarten darstellbare Zeichen. Du bräuchtest eine Komponente wo du nichtdarstellbaren Zeichen eine Art Platzhalter zuweisen könntest, um auch beim Speichern dieses Zeichen wieder herstellen zu können. Ob SynEdit das kann weiß ich nicht, must du in desen Doku nachschauen. So eine Funktion dürfte aber eher selten sein, normalerweise werden Texte in nicht-binären Formaten nur mit darstellbaren Zeichen gespeichert (siehe z.B. html oder rtf).
    Wenn bereits Steuerzeichen drinne sind ist es nicht mehr für den Benutzer gedacht, sondern nur noch für ein Gerät.

    bis bald
    akari



  • Naja, ich weiß nicht.
    Es geht sich um PCL um genauer zu sein um PCL 5 und das ist ja noch recht gut lessbar. Nur ich habe nun in einer weiteren TEST-PCL gesehen, dass dort Nullzeichen genutzt werden und ab denen hört mein Editor verständlicherweise auf zu laden.

    Und die Doku zu SynEdit ist mehr als dürftig, sie verweist auf einer andere?



  • Hallo

    Dann findest du vielleicht auch eine externe Komponente/Library die PCL-Dokumente richtig darstellen kann, wenn du dich nicht nur auf VCL-Kompatibilität beschränkst.

    Aber wie die Wiki auch sagt

    Die Printer Command Language (PCL) ist eine von Hewlett-Packard entwickelte Befehlssprache zum Steuern von Laserdruckern

    PCL ist nicht dazu gedacht direkt von Menschen gelesen zu werden. "recht gut" ist dabei kein Kriterium, denn wenn du eine exe in einem Hex-Editor aufmachst kannst du ja auch noch ein paar String-Literale lesen.

    bis bald
    akari



  • Ich habe dafür kaum Editoren gefunden und irgendwo müssen sowelche Dateien ja auch herkommen.
    Und Handbücher gibt es dazu auch, hab hier ein neben mir liegen 😉



  • Dann lade den Inhalt halt in ein char-array, dann hast du erstmal die Datei und kannst damit dann selber weiterarbeiten.



  • Hmm... jaja, die tolle Konsole.
    Es liegt wohl unter anderem an der Konvertierung zum AnsiString?

    Hab mal in einer Konsole rumprobiert, den Text Stück für Stück einzufügen:

    #include <string> 
    #include <fstream> 
    #include <iostream>
    #include <sys/types.h>
    #include <sys/stat.h> 
    
    int main() 
    {
        std::ifstream datei;
        datei.open("test.txt", std::ios::binary); //Öffnet die Datei
    
        //Bestimmt die Dateigröße
        struct stat buf;
        stat("test.txt",&buf);
        long dateigroesse = buf.st_size;
    
        std::cout<<"Dateigroesse: ";
        std::cout<<dateigroesse; //Zur Übersicht gibt er die Dateigröße aus
        std::cout<<"\n\n";
    
        char inhalt[dateigroesse];
    
       //Zählt immer eins +1 solange die Dateigröße erreicht wurde
     //   for(int zahl = 0; zahl != dateigroesse; zahl++) 
    //{
                datei.read(inhalt, dateigroesse);
                std::cout<< inhalt;
    //}
    
    datei.close();
    }
    

    test.txt:

    Text TEXT2
    

    edit: Unnötig die Forschleife... Als die noch nicht da war, wurde nach dem Nullzeichen abgeschnitten, deshalb wollte ich sie zur überprüfung einbauen... Hatte mich wohl irgendwo vertippt...

    edit: Ich werd verrückt 🤡
    Als die die Textdatei bearbeitet hatte, hatte er das Nullzeichen beim speichern entfernt, geht doch nicht. Habs übrigens, so wollte ich es eigentlich auch machen

    char inhalt[dateigroesse];
               for(int zahl = 0; zahl != dateigroesse; zahl++)
               {
                         datei.read(inhalt,dateigroesse);
                         std::cout<<inhalt[zahl];
    
              }
    

Anmelden zum Antworten