tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
17
ZUGRIFFE
425
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    papario papario ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    7
    Hallo Freunde,

    ich arbeite im Moment an diesem Beispiel: C++ Seite
    Soweit habe ich keine Anwende, alle Zeichen aus der Datei werden am Stück geladen und in mein reserviertes Speicher übertragen. Nun kommt aber ein Problem mit der Datei. Obwohl die Datei einige Zeichen und einige Spalten (nur zum Test) enthält, kommen in den reservierten Speicher noch zusätzliche Zeichen, die ich eigentlich nicht haben möchte.
    Das sind z.B. drei unebakannten Zeichen immer am Anfang des eigentlichen Textes (Ihnalt der Datei) und mehrere Zeichen (abhängig je nach Anzahl der Zeilen in der Datei) am Ende des Textinhaltes. Was sind das für Zeichen und wo kommen diese her? Wie kann man diese gleich weglassen bei übertragung? Bitte um Hilfe

    Vielen Dank und viele Grüße
    Geändert von papario (13.09.11 um 23:20 Uhr)
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi und Willkommen bei tutorials.de

    Kannst du einmal deine Datei und den aktuellen C++-Code (zwischen [cpp]...[/cpp]) zeigen?
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    SE Tutorials.de Gastzugang
    Zitat Zitat von papario Beitrag anzeigen
    Das sind z.B. drei unebakannten Zeichen immer am Anfang des eigentlichen Textes (Ihnalt der Datei) ...
    Öffne die Datei mal bitte mit einem Hex-Editor *z.B. HXD* und sieh dir diese drei Zeichen an.
    Ich vermute das diese folgende sind : 0xEF 0xBB 0xBF
    Falls ja : das ist die Kennzeichnung für UTF-8 und sollte dich eigentlich nicht stören das dies Metadaten sind. Öffne die Datei mal mit einem UTF-8 kodiertem Reader ... das sollte deine Probleme lösen.
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Ein "UTF-8 kodierter Reader" in C?
    fread interessiert sowas doch überhaupt nicht
    Solang die Daten aus Bytes bestehen
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  5. #5
    SE Tutorials.de Gastzugang
    Du weist das ich Java geschädigt bin =D ...
    Java interessiert es ja auch nicht wenn du mit einem RAW-InputStream und read() liest ... wohl aber wenn du mit einem InputStreamReader und einem Charset arbeitest.
    Ich dachte halt das es so bequeme Charset-Streams wie in Java gibt ... es würde das ganze etwas vereinfachen.
     

  6. #6
    papario papario ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    7
    Hallo Freunde, danke für die zahlreichen Antworten.

    Ja, das sind in der Tat die drei Kodierungszeichen "0xEF, 0xBB, 0xBF" vor dem Inhalt der Datei. Wird dieses Code nur erstellt, wenn man die Datei manuell beschreibt (Text Editor)? Weil wenn ich die Daten mit meinem Programm in die Datei schreibe, so tauchen diese nicht mehr auf.

    Was mich jedoch noch mehr stört, sind die Zeichen am Ende des Inhaltes. Egal ob die Datei maschinell (mit Programm) oder von mir per Hand erstellt wurde, sind diese immer da und variiren je nach Anzahl der enthaltenen Zeilen in der Datei. Das sind alles Hexzeichen (0xffcd). Was noch wichtiger ist, dass diese Zeichen in einem HExEditor nicht sichtbar sind, sondern nur die Zeichen "0xEF, 0xBB, 0xBF" die sich vor dem Inhalt befinden.

    Zum Code:

    Ich habe das Code genau so übernommen wie es auf der Seite war, 1:1. Bloss ich reserviere in Char Zeichen mehr (mit malloc) und setze nach dem Übertragen das letzte Zeichen auf '\0', sonst ist die Datei nicht abgeschlossen.
    Eine Daten zum Testen erstelle ich selber, einfach etwas reinschreiben mit mehreren Zeilen.

    Ich hoffe, Ihr könnt mit diesen Informationen etwas anfangen.

    Viele Grüße
     

  7. #7
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo,

    die Kodierungszeichen werden vom Texteditor erzeugt. Je nach Inhalt des Textes - wenn z.B. Umlaute enthalten sind - erfolgt eine entsprechende Kodierung der Zeichen. Einlesende Programme können dann anhand der 3 Kodierungszeichen den eingelesenen Text richtig dekodieren.

    Wenn du die zusätzlichen Zeichen am Ende mit einem Hexeditor nicht siehst, dann sind sie auch nicht da. Bist du dir sicher, dass du die abschließende '\0' wirklich an das Ende des eingelesenen Textes oder nicht vielleicht an das Ende des (größeren) allokierten Speichers setzt? Überprüfe das nochmal oder zeige deinen atuellen Code.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  8. #8
    papario papario ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    7
    Hallo Mcoder,

    ja, ich bin mir sicher, dass ich die binäre NULL auf das Ende setze. Wenn ich mir den von C++ vorgeschlagenen Code anschaue, so werten wir dort auch die Länge des Dateninhaltes aus "lSize = ftell (pFile);". Anschließend wird für diese Länge auch ein Speicher allociert. Hier reserviere ich einfach +1 Zeichen mehr um meine \0 zu platzieren. Was noch paradoxer ist, dass ich 3*\n in der Datei habe, so werden es am Ende auch 3*(0xffcd) stehen. Wenn 10*\n, so abgeleitet auch 10*(0xffcd) etc.

    Kann das sein, dass Anzahl Zeichen in der Datei falsch bestimmt werden (durch ftell())?

    Gruß
     

  9. #9
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo,

    bei solchen Bibliotheksfunktionen, wie ftell() ,kann man getrost davon ausgehen, dass sie korrekt arbeiten.

    Du kannst ja mal das Ergebnis von ftell() mit der Anzeige im Hexeditor vergleichen. Ansonsten zeigst du vielleicht doch mal den Code, wie du ihn jetzt verwendest. Ich habe jedenfalls keine Erklärung für das Problem.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  10. #10
    SE Tutorials.de Gastzugang
    Das Problem ist die von mir angesprochene UTF-8 Kodierung. Das Problem ist das jedes Zeichen mit 2 Bytes dargestellt wird , unabhängig davon ob du 2 Zeichen brauchst oder nicht. Wenn du jetzt also nur mit einem RAW-InputStream arbeitest erhälts du natürlich alle Bytes einzeln. Daher solltest du Google mal nach sowas wie UTF-8 Reader fragen da der dieser die 2Byte UTF-8 Zeichen in 1Byte Zeichen des PC-Charsets dekodiert und du somit auch "die richtige Länge" erhältst.
    Da ich *wie ebenfalls oben geschrieben* sehr Java "verwöhnt" bin und von C so eigentlich keien Ahnung habe weis ich nicht ob es sowas überhaupt im Standard gibt oder ob man selbst sowas elementares als Lib einbinden muss. Frag einfach mal Google was es dazu so gibt.
     

  11. #11
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Das ist tatsächlich eines der problematischeren Dinge in C++.
    Bzw war.
    Es hat bis 2011 gedauert, bis UTF8 irgendwie in den Standard aufgenommen wurde:
    http://en.wikipedia.org/wiki/C%2B%2B...tring_literals
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  12. #12
    papario papario ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    7
    Habe das Problem gefunden Es lag daran, dass ich die Datei nicht binär ausgelesen habe
    fopen ( "myfile.bin" , "r" );
    statt
    fopen ( "myfile.bin" , "rb" );
    Jetzt sind alle unnötigen Zeichen verschwunden.

    Das Einzige, was mir jedoch aufgefallen ist, dass in den Dateien der Zeilenumbruch "\n" aus zwei Zeichen dargestellt wird (0D 0A). Wenn ich die gesammte Datei einlese, so werden die beiden Zeichen auch so übergeben, binär halt. Doch wenn ich jetzt mit der Funktion "strstr()" arbeite um ein String aus der Datei und vorgegebenen Grenzen rauszuschneiden, so erkennt die Funktion strstr() für "\n" nur (0A) und somit bekomme ich ein Zeichen (0D) mehr in den String, was sich später in die Übertragung der Datei ebenfalls auswirkt, dann habe ich z.B.
    für Zeichenfolge "123\t123" in der Datei binär stehen (31 32 33 0D 09 31 32 33 0D)

    Wie kann man das verhindern?
     

  13. #13
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    Zitat Zitat von papario Beitrag anzeigen
    Das Einzige, was mir jedoch aufgefallen ist, dass in den Dateien der Zeilenumbruch "\n" aus zwei Zeichen dargestellt wird (0D 0A)
    Streng genommen stimmt Deine Aussage so nicht!
    Ein Zeilenumbruch besteht eigentlich immer aus zwei Zeichen:
    0x0A = \n = Line feed oder Zeilenvorschub
    0x0D = \r = Carriage Return oder Wagenrücklauf
    vgl. hjer: http://de.wikipedia.org/wiki/Steuerzeichen

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  14. #14
    papario papario ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    7
    Hallo Klaus,

    gerade nicht. Wenn ich die Ausgabe wie folgt definiere
    fprintf(FILE, "%s\n", CharString)
    und dann die Datei mit HexEditor öffne, so werde ich feststellen, dass dort für Zeilenumbruch auch nur (0x0A) steht.

    Grüße
     

  15. #15
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hast du die Datei im Binärmodus geöffnet?
    Das Doppelzeichen-"Problem" bezieht sich nur auf Text.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

Ähnliche Themen

  1. Verlinkung aus Lyteframe heraus bereitet Probleme
    Von shredder01 im Forum Javascript & Ajax
    Antworten: 0
    Letzter Beitrag: 11.01.10, 16:21
  2. Antworten: 6
    Letzter Beitrag: 13.10.09, 13:05
  3. NB-Fan bereitet mir Probleme
    Von haensel im Forum Hardware
    Antworten: 1
    Letzter Beitrag: 28.09.04, 15:22
  4. [C] Probleme mit fwrite & fread
    Von Yupa im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 14.03.04, 12:01
  5. EPS-Format bereitet Probleme...
    Von bekay im Forum Photoshop
    Antworten: 4
    Letzter Beitrag: 24.03.03, 09:34