Arbeiten mit fread bereitet etwas Probleme

papario

Grünschnabel
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
 
Zuletzt bearbeitet:
Hi und Willkommen bei tutorials.de :)

Kannst du einmal deine Datei und den aktuellen C++-Code (zwischen [code=cpp]...[/code]) zeigen?
 
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.
 
Ein "UTF-8 kodierter Reader" in C?
fread interessiert sowas doch überhaupt nicht ;-)
Solang die Daten aus Bytes bestehen :D
 
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
 
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
 
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.
 
Zurück