ERLEDIGT
JA
JA
ANTWORTEN
17
17
ZUGRIFFE
425
425
EMPFEHLEN
-
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üßeGeändert von papario (13.09.11 um 23:20 Uhr)
-
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, ...?
-
14.09.11 05:31 #3SE Tutorials.de Gastzugang
Ö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.
-
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, ...?
-
14.09.11 05:47 #5SE 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.
-
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
-
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
-
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ß
-
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
-
14.09.11 13:18 #10SE 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.
-
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_literalsNetiquette (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, ...?
-
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?
-
14.09.11 15:50 #13
Moin,
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ß
KlausEs 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 !!
-
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
-
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
-
Verlinkung aus Lyteframe heraus bereitet Probleme
Von shredder01 im Forum Javascript & AjaxAntworten: 0Letzter Beitrag: 11.01.10, 16:21 -
IE 8 bereitet Probleme bei ausklappbarem Menü
Von nimenn im Forum CSSAntworten: 6Letzter Beitrag: 13.10.09, 13:05 -
NB-Fan bereitet mir Probleme
Von haensel im Forum HardwareAntworten: 1Letzter Beitrag: 28.09.04, 15:22 -
[C] Probleme mit fwrite & fread
Von Yupa im Forum C/C++Antworten: 4Letzter Beitrag: 14.03.04, 12:01 -
EPS-Format bereitet Probleme...
Von bekay im Forum PhotoshopAntworten: 4Letzter Beitrag: 24.03.03, 09:34





Zitieren



Login






