2 Fragen zum Lesen von Daten
-
Hallo,
ich habe zwei Fragen.
Meine erste:
Wenn ich eine *.txt datei öffne und sie Zeichen für Zeichen in ein char schreibe, werden Leerzeichen und Zeilenumbrüche ignoriert. Warum ist das so? Und was kann man dagegen unternehmen?Meine zweite:
Wie kann man eine Datei Bit für Bit auslesen?Mit ratlosen Grüßen
DerRatlose
-
DerRatlose schrieb:
Meine erste:
Wenn ich eine *.txt datei öffne und sie Zeichen für Zeichen in ein char schreibe, werden Leerzeichen und Zeilenumbrüche ignoriert. Warum ist das so?Vermutlich weil Du nicht korrekt einliest.
Und was kann man dagegen unternehmen?
Richtig einlesen.
(Ok, an diesem Punkt müsste ich wissen, wie Du einliest, um Dir zu sagen, warum es sich so verhält.)
Meine zweite:
Wie kann man eine Datei Bit für Bit auslesen?Zeichen für Zeichen auslesen und die einzelnen Bits aus den Zeichen extrahieren.
-
OK, nehmen wir als Grundlage dieses kleine Programm:
#include <iostream> #include <fstream> using namespace std; int main() { char c; fstream f1, f2; f1.open( "lesen.txt", ios::in ); f2.open( "schreiben.txt", ios::out ); while( !f1.eof() ) { f1 >> c; cout << c; f2 << c; } return 0; }In der Datei lesen.txt steht folgender Text:
hallo test testDie Ausgabe auf der Konsole lautet: hallotesttestt
In der Datei schreiben.txt steht nach dem Ablauf des Programms: hallotesttesttDas Leerzeichen und der Zeilenumbruch wurden ignoriert. Und warum auch immer wird das letzte Zeichen zweimal ausgegeben/in die Datei geschrieben.
Und wegen dem Auslesen Bit für Bit:
LordJaxom schrieb:
Zeichen für Zeichen auslesen und die einzelnen Bits aus den Zeichen extrahieren.
1. Wie geht das?
2. Funktioniert das auch, wenn die Datei binär vorliegt?Mit freundlichen Grüßen
DerRatlose
-
Ok, auf dieser Grundlage kann man weiterhelfen: Der Stream-Operator >> ist für Texte gedacht und liest logische Einheiten, die durch Whitespace (Leerzeichen, Tabulator, Zeilenumbruch, ...) getrennt sind. Bei einzelnen Zeichen mag man sich fragen, ob das Sinn macht, bei Einheiten wie Strings, Integern usw. macht es das aber durchaus.
Willst Du die Zeichen "roh" haben, musst Du das Überspringen von Whitespace deaktivieren, oder aber die Lesebefehle für physikalische Einheiten (read, readsome, get) verwenden. Letzteres könnte performanter sein.
char c; while( f1.get( c ) && !f1.eof() ) { cout << c; f2 << c; }Zur zweiten:
Zeichenweises Auslesen geht wie oben. Bits kannst Du mit logischen Operatoren extrahieren (such mal nach Bitarithmetik), und das ganze funktioniert auch mit binären Dateien. Diesen solltest Du beim Öffnen allerdings zusätzlich das Flag ios::binary mitgeben.
-
Du kannst beim Öffnen der Datei das Flag
std::ios::binaryangeben, dann werden die Text-Routinen (z.B. das Auslassen von Leerzeichen) nicht angewandt.
Das Kopieren einer Datei sieht dann etwa so aus:#include <iostream> #include <fstream> using namespace std; int main() { ifstream in( "lesen.txt", ios::binary ); ofstream out( "schreiben.txt", ios::binary ); char buf[512]; do { in.read( buf, 512 ); out.write( buf, in.gcount() ); } while ( in && in.gcount()==512 ); }Anm.: ifstream::gcount() liefert die Anzahl der Bytes zurück, die beim letzten ungepufferten Lesevorgang gelesen wurden.
-
Vielen Dank für die Tipps. Funktioniert alles sehr gut.

Ich weiß allerdings immer noch nichts mit der Bitarithmetik anzufangen... Kann man mir da vielleicht mal etwas mehr zu sagen?Mit freundlichen Grüßen
DerRatlose
-
DerRatlose schrieb:
Ich weiß allerdings immer noch nichts mit der Bitarithmetik anzufangen... Kann man mir da vielleicht mal etwas mehr zu sagen?
Na sischa: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39352.html
-
Hallo,
danke für die Antwort. Hat mir schon weitergeholfen

Mit freundlichen Grüßen
DerRatlose