getline() Funktion
-
Hallo,
kurze Frage, wenn ich eine datei öffne in einem ifstream objekt und mir dann per getline alle zeilen bis zum ende hole,
wie bekomm ich es dann hin beim erneuten durchlaufen der datei mir wieder die erste zeile zu holen.Beispiel:
ifstream datei; string zeile; datei.open("test.txt", ios::in); while(!datei.eof()) // durchläuft alle zeilen bis ende getline(datei,zeile); while(!datei.eof()) // geht nicht in die schleife, da bei der erste schleife das ende schon erreicht wurde. WIE LÖSE ICH DIES ? getline(datei,zeile);
-
rewind(FILE*)
oder per
seekg() auf die erste stelle setzendas obere ist einfacher
-
Stelfer schrieb:
rewind(FILE*)
oder per
seekp() auf die erste stelle setzendas obere ist einfacher
ifstream datei; string zeile; datei.open("test.txt", ios::in); while(!datei.eof()) getline(datei,zeile); rewind(FILE*) while(!datei.eof()) getline(datei,zeile);
So ?
-
mach einfach
datei.seekg(0, ios::beg);oder rewind(FILE* datei)
edit:
wenn du seekg benutzt musst du noch das EOF tag löschen mittels
datei.clear();
-
@Stelfer:
Was nützt ihm hier rewind, wenn er C++-Streams hat? Du sagst "ist einfacher", dabei müsste er doch vorher das ganze Programm auf C-Streams umschreiben!?
-
LordJaxom schrieb:
@Stelfer:
Was nützt ihm hier rewind, wenn er C++-Streams hat? Du sagst "ist einfacher", dabei müsste er doch vorher das ganze Programm auf C-Streams umschreiben!?ah stimmt hab grad nicht dran gedacht -.- i`m so sorry
-
LordJaxom schrieb:
@Stelfer:
Was nützt ihm hier rewind, wenn er C++-Streams hat? Du sagst "ist einfacher", dabei müsste er doch vorher das ganze Programm auf C-Streams umschreiben!?Kann mir vielleicht noch jemand helfen ?
Danke trotzdem für die schnelle Antwort!!!!
-
Reichen dir die obigen Hilfestellungen nicht? Du mußt mit mit seekg() zurückfahren auf den Dateianfang und mit clear() das eofbit resetten, damit du nochmal einlesen kannst.
ifstream datei; string zeile; datei.open("test.txt", ios::in); while(!datei.eof()) getline(datei,zeile); Datei.seekg(0,ios::beg); Datei.clear(); while(!datei.eof()) getline(datei,zeile);
-
CStoll schrieb:
Reichen dir die obigen Hilfestellungen nicht? Du mußt mit mit seekg() zurückfahren auf den Dateianfang und mit clear() das eofbit resetten, damit du nochmal einlesen kannst.
ifstream datei; string zeile; datei.open("test.txt", ios::in); while(!datei.eof()) getline(datei,zeile); Datei.seekg(0,ios::beg); Datei.clear(); while(!datei.eof()) getline(datei,zeile);
danke.
-
das wurde doch schon zig mal gepostet
....
-
Hatte Urlaub, wollte grad weitermachen, da stell ich fest das es nicht funktioniert.
wenn ich die datei schließe und öffne gehts, dass er neu einlesen kann ab dem Anfang, aber ich muss ab einer bestimmte Stelle was auslesen da benötige ich es dann eh.
Und ja es liegt nicht an den unterschiedlichen Variablennamen, was man weiteroben als Fehler sehen könnte. Ich verwende nur "datei".
Kurzes Beispiel:
#include <fstream> #include <iostream.h> #include <conio.h> using namespace std; void main(void) { ifstream datei; string zeile, parameter1 = "SaD.exe"; int parapos = -1, zeilenanzahl = 0, abwo = 2; datei.open("ReadMe.nfo", ios::in); while(!datei.eof() && (abwo != 0)) { getline(datei,zeile); while((zeile.find(parameter1,parapos) != string::npos) && (abwo != 0)) { parapos = zeile.find(parameter1,parapos); parapos++; abwo--; } if(abwo != 0) { parapos = -1; zeilenanzahl++; } } datei.seekg(zeilenanzahl,ios::beg); // In der ersten Schleife wurde bestimmt in zeilenanzahl ab wo ich per getline starten soll. In welcher Zeile datei.clear(); while(!datei.eof()) { getline(datei,zeile); cout << zeile << endl; } getch(); }
-
Erstens wäre es mal einen Versuch wert, die beiden Aufrufe umzutauschen (erst clear() und danach seekg()) - ich bin mir nicht 100% sicher, was für Operationen ein Stream im Fehlermodus noch zulässt.
Zweitens: seekg() bekommt seine Zielposition in Zeichen angegeben. Um eine bestimmte Zeile anzusteuern, benötigst du etwas mehr Aufwand.
-
CStoll schrieb:
Erstens wäre es mal einen Versuch wert, die beiden Aufrufe umzutauschen (erst clear() und danach seekg()) - ich bin mir nicht 100% sicher, was für Operationen ein Stream im Fehlermodus noch zulässt.
Zweitens: seekg() bekommt seine Zielposition in Zeichen angegeben. Um eine bestimmte Zeile anzusteuern, benötigst du etwas mehr Aufwand.
Danke. Das 2te habe ich leider grad auch festgestellt ^^. Ich bin schon dran. thx
-
#include <fstream> #include <iostream.h> #include <conio.h> using namespace std; void main(void) { ifstream datei; string zeile, parameter1 = "SaD.exe"; int parapos = -1, abwo = 2, zeichenanzahl = 0; datei.open("ReadMe.nfo", ios::in); while(!datei.eof() && (abwo != 0)) { getline(datei,zeile); while((zeile.find(parameter1,parapos) != string::npos) && (abwo != 0)) { parapos = zeile.find(parameter1,parapos); parapos++; abwo--; } if(abwo != 0) { parapos = -1; zeichenanzahl = zeichenanzahl + zeile.length(); } } datei.clear(); datei.seekg(zeichenanzahl); while(!datei.eof()) { getline(datei,zeile); cout << zeile << endl; } getch(); }
Ich habe die richtige "Anzahl" in der Variablen "Zeichenanzahl" aber bei setzem des Get Pointer bzw dann beim lesen fängt er eine Zeile vorher kurz vorm Ende an. So 5-10 Zeichen vorm Ende. 1 Zeichen hätte ich mir erklären können genauso wie die Anzahl der Zeilenumbrüche hinter jeder Zeile.
CStoll teste das mal mit irgendeiner Datei und änder "SaD.exe" im Parameter1
-
Was für einen Sinn hatt denn die "if(abwo!=0)" Abfrage? Vermutlich kommt der Fehlbetrag daher, daß du die Zeichenzahl in dieser Abfrage erhöhst und deshalb die Zeile mit dem zweiten "SaD.exe"-Eintrag nicht mitzählst.
(btw, was für einen Sinn hat denn das Programm?)
-
CStoll schrieb:
Was für einen Sinn hatt denn die "if(abwo!=0)" Abfrage? Vermutlich kommt der Fehlbetrag daher, daß du die Zeichenzahl in dieser Abfrage erhöhst und deshalb die Zeile mit dem zweiten "SaD.exe"-Eintrag nicht mitzählst.
(btw, was für einen Sinn hat denn das Programm?)
Also ich such in einer Datei nach "SaD.exe". "SaD.exe" kann auch doppelt in einer Zeile vorkommen. Ich gebe meinem Programm einen Parameter mit (abwo) z.b. die Zahl 2. Also ab dem zweiten gefundenen "SaD.exe" mach was bestimmtes.
Die Abfrage auf ungleich 0 ist nur dafür da beim letzten durchlauf meine Variable "parapos" nicht zu reseten.Die Datei sieht beispielsweise so aus:
Author: Donald DuckXXXXX <---- 24 Zeichen
Programmname: SaD.exeXXX <---- 24 Zeichen
ProgrammrevisionsnummerX <---- 24 Zeichen
Datum: 16.03.2007XXXXXXX <---- 24 Zeichen
Programmiert im: Borland <---- 24 Zeichen
SaD.exe Dateiname.Dateityp "Begriff1" "Begriff2"In der Variablen "zeichenanzahl" steht nun die Summe aller oben zusammengezählten Zeichen (Anzahl: 120 Zeichen)
-
Ich würde schon vermuten, daß es an den Zeilenumbrüchen liegt - am Ende jeder Zeile steht ein Zeilenende, der von getline weggeworfen wird und deshalb nicht mit in die Zählung einfließt (das macht unter UNix-Systemen 1 Zeichen pro Zeile ("\n"), unter Windows 2 Zeichen pro Zeile ("\r\n)).
Wenn du wirklich die exakte Zielposition bekommen willst, nimm lieber tellg() (das ist die "Umkehrung" zu seekg()).
-
funzt. Danke