Nur bestimmte Stellen auslesen?
-
Hallo zusammen,
ich hab da ein Problem und zwar lies ich eine ASCII-Datei ein und möchte danach aber nur bestimmte Stellen wiederrum auslesen und in Variablen zur Weiterverarbeitung schreiben.
Kann mir einer von Euch sagen wie ich das am besten machen kann?Vielen Dank
Viele Grüße
-
Wenn du weißt, an welcher Stelle die Daten sind (Bytes vom Dateianfang), kannst du mit dem passenden seek()-Befehl dorthin springen und dann anfangen zu lesen. Wenn nicht, mußt du vom Dateianfang soviele Zeichen überlesen, bis du an der richtigen Stelle bist.
("passend" meint, daß der genaue Befehl davon abhängt, womit du die Dateiverarbeitung erledigen willst)
PS: Eventuell wäre es auch möglich, die komplette Datei einmal einzulesen und dann im Speicher damit zu hantieren.
-
Ok, ich bekomm die Datei halt z.B. so 1206060220331587988787VAUN4654 usw
wie mache ich das dann wenn ich z.B. Stelle 4-8, 12-20 usw brauche. Ich müsste das dann in ne neue Variable schreiben um dann denn wert z. 060220 zusammen auslesen zu können.
Vielen Dank
Viele Grüße
-
flip schrieb:
wie mache ich das dann wenn ich z.B. Stelle 4-8
Springen an Position 4 und anschließend 4 Zeichen (=8-4) lesen.
fstream file("daten.dat",ios::in); char data[10]; file.seekg(4);//Ziel ansteuern file.read(data,4);//Daten auslesen ...
-
Vielen Dank schon mal,
funktioniert ganz gut aber er schreibt mir nach den 4 Zeichen noch ein paar komische Zeichen hin.
Wie bekomme ich die denn noch weg?
-
Indem du nur mit den vier gelesenen Zeichen weiterarbeitest (oder du setzt nach dem read()-Befehl "data[4]='\0';", dann wird die Zeichenkette sauber abgeschlossen).
-
Das liegt daran, das dein Feld nicht richtig initialisiert wurde (char data[10])
d.h. das Feld wurde nicht mit Nullen initialisiert.
Dafür gibts z.B. den Befehl calloc.Edit: Da war jemand schneller
, es funktioniert aber beides!
-
aha ok und des bedeuted?
was muss ich mit dem calloc machen?
-
ich bekomme jetzt immer ne fehlermeldung das mein stack um die variable data corrupted ist.
Was muss ich denn da jetzt machen?
-
String-Verarbeitung basiert in C(++) darauf, daß eine Zeichenkette mit \0 beendet wird. Und da data nicht initialisiert wurde, stehen dort am Anfang willkürliche Werte drin. Jetzt kommt der read()-Befehl und füllt die ersten vier Zeichen des Arrays mit definierten Werten, aber ab dem fünften Zeichen (data[4]) steht weiterhin Müll (der z.B. bei einem cout Aufruf als "komische Zeichen" erscheint).
Lösung des Dilemmas ist es, entweder das Array vorher komplett mit 0 zu füllen, einen mit 0 vorbelegten Speicherbereich zu reservieren (das macht calloc) oder den Null-Terminator für die Weiterverarbeitung anzuhängen (siehe mein obiger Beitrag).
-
Ok, das einlesen funktioniert jetzt saugut, aber was muss ich denn machen wenn ich mehrmals etwas einlesen muss. Des funktioniert noch nicht so richtig.
-
Oder wäre es besser wenn ich meinen Eingabestrom in ein Array schreib und dann aus diesem auslese?
-
Wozu mehrmals einlesen? Merk dir den Wert einmal im Programm und verwende ihn dann so oft wie du ihn brauchst.
(ansonsten mußt du vor einem neuen Einlesen auch wieder an die richtige Position seek()en - nach dem obigen read()-Beispiel steht der Lesezeiger der Datei auf Position 8 )
Edit: Und ja, wenn du ständig durch die Datei durchackern willst, ist es womöglich günstiger, sie einmal einzulesen und dann im Speicher zu halten.
-
ok, ich schreib den eingelesenen Wert in ne Variable. Wenn ich aber dann von 15-21 einlesen will dann funktionierts net.
Muss ich da den kompletten vierzeilen nochmal nehmen?
-
Was muss ich dann den machen wenn ich Datei einmal lokal abspeichern will und dann aus ihr auszulesen?
Vielen Dank
Viele Grüße
-
Nimm dir einen vector (oder einen anderen Container der STL) und kopier die Datei komplett dort rein (byteweise auslesen und per push_back() einfügen).
-
Kannst Du mir vielleicht sagen was an folgendem Code falsch ist:
fstream file(datei,ios::in);
char sender[7], dat[7];
file.seekg(9);//Ziel ansteuern
file.read(sender,6);//Daten auslesen
sender[6]='\0';
cout<<sender<<endl<<endl;
file.seekg(25);//Ziel ansteuern
file.read(dat,6);//Daten auslesen
dat[6]='\0';
cout<<dat;Ich bekomm bei der Ausgabe nur sender angezeigt. Dat wird mir nicht ausgegeben. An was kann das denn liegen?
-
a) ist die Datei lang genug?
b) womöglich steht dat noch im Ausgabepuffer - cout schreibt erst auf den Bildschirm, wenn der Puffer voll ist (oder du ihn entleerst, z.B. mit "cout<<endl;").
-
Ja die Datei wäre lang genung. Sie hat 274 Zeichen und mit endl oder .flush() funktioniert es auch nicht. Was kann ich denn da noch machen?
-
flip schrieb:
Was kann ich denn da noch machen?
Breakpoint setzen und den Debugger fragen, was in den verwendeten Variablen landet.
-
Oh mann ich blicks echt nicht mehr,
du kann ich die seek funktion auch benutzen wenn ich mir den ganzen Dateiinhalt in ein array reinschreibe?
Wie lautet denn dann der Code?Vielen Dank