String Buchstabenweise aus Datei laden
-
Hallo,
ich hab ein Textdokument, mit einem SEHR langen string. Ich kenne nur zwei Methoden, strings aus einem Textdokument einzulesen. Über getline oder dirket über is >> string . Da der string sehr lang ist, dauert das relativ lange. Die Anzahl der Zeichen des strings werden vom Benutzer bestimmt. Im Moment mache ich das so, dass ich den gesamten Inhalt des Textdokumentes in einen std::string lade, und dann die überflüssigen Buchstaben "abschneide".
Gibt es eine Möglichkeit die Anzahl der Zeichen direkt beim einlesen zu begrenzen? Eine art getchar() ?
-
if(file) { zeilen = 0; while(!file.eof()) { getline(file, txt); text = txt + "\n"; zeilen++; if(zeilen == 26) // gesuchte Zeile erreicht { break; // Zeile gefunden, Einlesen abbrechen cout<<text; } }so vielleicht mit BREAK ? man kann das auch mit stellen machen.
edit: müll entfernt
-
Das Problem ist, dass die gesamte Datei ein zusammenhängender String ist. Ohne Zeilensprung oder Leerzeichen. Ich könnte natürlich die Datei so anlegen, dass zwischen jedem Buchstaben ein Leerzeichen steht und dann X mal is >> string einlesen; aber ich denke, dass das ganze dadurch nicht schneller wird
-
@Tim06TR,
Lern mal deinen Code zu formatieren...@charlad,
Es gibt noch deutlich mehr Funktionen bei einem std::istream oder eine davon abgeleitete Klassen:
http://www.cplusplus.com/reference/iostream/istream/Womöglich könnte dies hilfreich sein:
http://www.cplusplus.com/reference/iostream/istream/getline/Oder eine Kombination aus diesen zwei:
http://www.cplusplus.com/reference/iostream/istream/read/
http://www.cplusplus.com/reference/iostream/istream/ignore/Kommt ein wenig darauf an, was du genau willst

Grüssli
-
istream::read ist genau das, was ich gesucht habe! Danke

-
int stellen if(file) { stellen = 0; while(!file.eof()) { getline(file, txt); text += txt; stellen = text.size() + stellen; if(stellen >= 900) // bei buchstabe 900 aufhörengröße erreicht { break; // Zeile gefunden, Einlesen abbrechen cout<<text; } }so müsste es gehen, hoffe ich nicht getestet
EDIT: das beitrag schreiben dauert zu lang :(, dann ist schon alles geklärt. geht das hier trotzdem ?
@ dravere: code formatieren ? soll das heißen das ausehen optimieren ? definition bitte.
-
mit Formatieren ist vernünftiges Einrücken gemeint
int stellen; if(file) { stellen = 0; while(!file.eof()) { getline(file, txt); text += txt; stellen = text.size() + stellen; if(stellen >= 900) { break; cout<<text; } } getch(); }Allerdings weis ich nicht genau was dein Code machen soll? 1. Setzt er voraus, dass Pro Zeile nur ein Buchstabe steht und 2. ist die Berechnung stellen = text.size() + stellen; auch seltsam (text.size() wäre in dem Falle genug)
-
ok, ich habe vergessen zu berücksichtigen, dass er alles auf einmal ausliest. somit ist der script natürlich quatsch...
-------------------------------------------------------------------------
ARGH GEWITTER
-
Vor allem ist auch ein
while(!file.eof())quatsch. Man sollte nie die Funktioneofals Abbruchbedingung nehmen, denn daseofbitFlag ist eigentlich immer zu spät. Es wird erst gesetzt, wenn eine Leseoperation über den Rand des Files hat probiert zu lesen. Man kann allerdings die Gültigkeit einer Leseoperation prüfen und dies sollte man auch tun. Die Prüfung erfolgt dadurch, dass jede Leseoperation den Stream zurückgibt. Der Stream selbst kann man direkt prüfen, ob er noch gültig ist:
http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/
bzw.
http://www.cplusplus.com/reference/iostream/ios/operatornot/Grüssli