tellg() position
-
Leute nur mal ne kurze Frage. Kann es sein dass die Funktion tellg() die aktuelle stelle im stream verändern.
Wollte nämlich mal bestimmte Zeilenpos währen des einlesens speichern, aber irgendwie vermurkst er was...
-
ismaild schrieb:
Leute nur mal ne kurze Frage. Kann es sein dass die Funktion tellg() die aktuelle stelle im stream verändern.
Wollte nämlich mal bestimmte Zeilenpos währen des einlesens speichern, aber irgendwie vermurkst er was...
Nein tut es nicht. Irgendwie vermurkst du wohl was

-
ifstream data("test.txt"); int FileCharCount(0),i(0); data.seekg(0, std::ios::end); FileCharCount= data.tellg(); data.seekg(0, std::ios::beg); std::ios::pos_type linepoint; while(getline(data,line)) { if(i==0) linepoint= FileCharCount-(FileCharCount-(data.tellg()-5)); else linepoint= FileCharCount-(FileCharCount-data.tellg()); ..... //speichere zeilenanfangspunkt ..... i++; }Ok was vermurks ich hier steh gerade aufm Schlauch??
-
Warum schreibst du statt
linepoint = FileCharCount-(FileCharCount-data.tellg());nicht
linepoint = data.tellg();?
Ich vermute, was er da "vermurkst" ist, dass der Anfangspunkt der zweiten Zeile nicht gespeichert wird, was auch wenig verwunderlich ist, weil du in dem Schleifendurchlauf data.tellg() - 5 speicherst, aber deine Fehlerbeschreibung war nicht besonders erhellend.
Wie wäre es mit
linenums.push_back(0); while(std::getline(data, line)) { linenums.push_back(data.tellg()); } linenums.pop_back();, wobei linenums der Container für die Zeilennummern ist?
-
linepoint = FileCharCount-(FileCharCount-(data.tellg()-5)) = FileCharCount - FileCharCount + data.tellg() - 5 = data.tellg() - 5 < 0 für zu kurze erste ZeilenIch denk mal, ios::pos_type ist unsigned, dann wird das ne schöne Zahl um die 4,3 Milliarden.
-
std::ios::pos_type löst sich um mehrere Ecken zu einer Spezialisierung der Klassenvorlage std::fpos auf. Diese muss Überladungen bereitstellen, um sich kompatibel zu std::streamsize, einem vorzeichenbehafteten Integertyp, zu verhalten.
-
Ja was soll ich sagen ich glaube ich kann mich net erklären.
Beim ersten tellg() schiesst der schon übers ziel (BOM) deswegen -5.
Eigentlich will ich nur die position jeden zeilenanfang einer datei speichern.
-
Warum machst du es nicht einfach so:
ifstream data("test.txt"); int FileCharCount = 0; data.seekg(0, std::ios::end); FileCharCount = data.tellg(); data.seekg(0, std::ios::beg); std::vector<std::ios::pos_type> line_points; line_points.push_back( data.tellg() ); // Datei beginn => 1. Zeile while(getline(data,line)) { line_points.push_back( data.tellg() ); //Speichere anfang der nächsten Zeile } line_points.pop_back(); // Die letzte hinzugefügte zeile löschen (weil getline dann schon nichts mehr bekommen hat => Datei ende )
-
Warum keine do-while() Schleife? Damit erschlägt man auch sofort die Sonderfälle.
... do { line_points.push_back( data.tellg() ); } while( getline( data,line ) );
-
DocShoe schrieb:
Warum keine do-while() Schleife? Damit erschlägt man auch sofort die Sonderfälle.
... do { line_points.push_back( data.tellg() ); } while( getline( data,line ) );Weil ich davon ausgegangen bin das er mit den Zeilen auch noch was anderes machen will da er da in seinem code ein '...' hatte.
Ansonsten musst du da ein if einbauen.if( !line_points.empty() )oder so.
wenn er nur die Zeilenanfänge haben will dann ist das besser. Das ist richtig.
-
Ok habe mal folgendes gemacht
dies ist der inhalt meiner Textdatei.Dies ist eine Beispielzeile Dies ist die zweite Zeile Dies ist die unendliche Zeile minus 1Dies der code:
ifstream data("test.txt"); int FileCharCount = 0; std::ios::pos_type test; data.seekg(0, std::ios::end); FileCharCount = data.tellg(); data.seekg(0, std::ios::beg); string line; while(getline(data,line)) { test=data.tellg(); }Nachdem ersten tellg() habe ich in der VAriablen test 31 gehabt in wirklichkeit habe ich 27 Zeichen in der Zeile.
Beim zweiten Tellg() 54 und beim dritten 95. Würde bedeuten ich habe einen VErsatz von drei Zeichen.
-
Dir ist schon klar das der string keine \n und \r zeichen enthält oder?
Die werden von getline schon entfernt.
-
Was heisst das jetzt ?
meinst Du tellg() berücksichtigt Sie und string nicht, deswegen der Versatz?
-
Das heisst, dass getline() die komplette Zeile inklusive aller Umbrüche einliest, aber der resultierende string sie nicht enthält.
-
So jetzt ist das Durcheinander komplett.
Ehrlich Leute besten Dank für Eure Mühen aber ich verstehe Momentan nur noch Bahnhof....
Wieso liest der die mit ein wenn der die eh löscht..
-
ismaild schrieb:
Wieso liest der die mit ein wenn der die eh löscht..
Womöglich weil er das Zeilenende finden muss? Es heisst ja auch
getline, also hole die Zeile, bzw. lese alles bis zum nächsten Zeilenumbruch. Wenn er nur vorausschauen würde (peek), ob ein Zeilenende kommt, dann müsstest du die Zeichen immer manuell entfernen, da er sonst danach immer eine leere Zeile sieht, da der Zeilenumbruch immer noch vor ihm liegt.Wieso der zurückgegebene String den Zeilenumbruch nicht enthält, darüber kann man wohl streiten, aber in den meisten Fällen braucht man ihn nicht.
Grüssli
-
vielen lieben dank ;o)