Datei zeilenweise lesen
Den Inhalt file.txt sind:
5 3
6 4
7 1
10 5
11 6
12 3
12 4
Wo 5 3
ist ein Koordinaten-paar.
Wie kann ich diese Daten Zeile für Zeile in C++?
Ich bin in der Lage zu Holen Sie sich die erste Zeile, aber wie bekomme ich die nächste Zeile der Datei?
ofstream myfile;
myfile.open ("text.txt");
InformationsquelleAutor der Frage dukevin | 2011-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, machen eine
ifstream
:Den zwei standard-Methoden:
Davon ausgehen, dass jede Zeile besteht aus zwei zahlen und Lesen von token durch den token:
Line-basierte Parsen mit string-streams:
Sollte man nicht mischen (1) und (2), da die token-basierte Analyse nicht verschlingen-Zeilenumbrüche enthalten, so können Sie am Ende mit fadenscheinigen leere Zeilen, wenn Sie
getline()
nach token-basierte Extraktion bekam Sie am Ende einer Zeile bereits.InformationsquelleAutor der Antwort Kerrek SB
Verwenden
ifstream
um Daten aus einer Datei Lesen:Wenn Sie wirklich brauchen, zu Lesen, Zeile für Zeile, dann tun Sie dies:
Aber Sie brauchen wahrscheinlich nur zum extrahieren von koordinatenpaaren:
Update:
In Ihrem code, den Sie verwenden
ofstream myfile;
jedoch dieo
imofstream
steht füroutput
. Wenn Sie möchten, die Datei zu Lesen (input) verwendenifstream
. Wenn Sie möchten, Lesen und schreiben verwendenfstream
.InformationsquelleAutor der Antwort K-ballo
Da Ihre Koordinaten gehören zusammen wie die Paare, warum nicht schreiben Sie eine struct für Sie?
Dann schreiben Sie eine überladene Extraktion Betreiber für istreams:
Dann können Sie eine Datei Lesen von Koordinaten direkt in einen Vektor so:
InformationsquelleAutor der Antwort Martin Broadhurst
Erweiterung auf die Antwort akzeptiert, wenn die Eingabe:
werden Sie noch in der Lage sein, um die gleichen Logik, wie diese:
InformationsquelleAutor der Antwort gsamaras
Zwar gibt es keine Notwendigkeit, die Datei zu schließen manuell aber es ist eine gute Idee dies zu tun, wenn der Umfang der Datei variable ist größer:
InformationsquelleAutor der Antwort Vijay Bansal
Liest eine Datei Zeile für Zeile in C++ kann man in einige verschiedene Möglichkeiten.
[Schnell] Schleife mit std::getline()
Die einfachste Methode ist das öffnen std::ifstream und Schleife mit std::getline () - Aufrufe. Der code ist sauber und einfach zu verstehen.
[Schnell] die Verwendung von Boost ist file_description_source
Andere Möglichkeit ist die Verwendung der Boost-library, aber der code wird ein wenig Ausführlicher. Die Leistung ist sehr ähnlich zu den obigen code (Schleife mit std::getline()).
[Schnellste] der Einsatz von C-code
Wenn die Leistung ist entscheidend für Ihre software, können Sie erwägen, die Verwendung der C-Sprache. Dieser code kann 4-5 mal schneller als die C++ - Versionen vor, siehe benchmark unten
Benchmark -- Was ist schneller?
Habe ich getan einige performance-benchmarks mit dem code oben und die Ergebnisse sind interessant. Ich habe getestet, der code mit ASCII-Dateien mit jeweils 100.000 Zeilen, 1,000,000 Linien und von 10.000.000 Zeilen text. Jede Textzeile enthält 10 Wörter im Durchschnitt. Die Ergebnisse zeigen die Zeit (in ms), dass jedes Stück code, das nahm, die files zu Lesen.
Den Unterschied in der Leistung zwischen den beiden C++ - Ansätze ist minimal und sollte nicht machen einen Unterschied in der Praxis. Die Leistung der C-code ist, was macht die benchmark beeindruckend und kann ein Spiel-wechsler in Bezug auf die Geschwindigkeit.
InformationsquelleAutor der Antwort HugoTeixeira
mit dem command-line arguments:
InformationsquelleAutor der Antwort Alex Spencer