Nur bestimmte Stellen auslesen?
-
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
-
vector<char> filedata; ifstream file("daten.txt",ios::in|ios::binary); char ch; while(file.get(ch)) filedata.push_back(ch);
Das liest den kompletten Dateiinhalt in den vector (dynamisches Array) 'filedata' - anschließend kannst du dort beliebig vor und zurück laufen und mit den einzelnen Elementen arbeiten
Um einen Teilbereich zu betrachten, kannst du entweder direkt Pointer in die Daten verwenden oder den Bereich rauskopieren:
char data[7]={0}; copy(filedata.begin()+9,filedata.begin()+15,data);