Datei Zeilen sortieren und nur bis Zeilenumbruch einlesen
-
Hallo,
ich habe eine TXT-Date wie folgt:
aaammm; ddnn; bbccff; .........;
123; 123; 4334; 0,89; .........;hier mein code
[code="cpp"][code]
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>using namespace std;
int main () {
string line;
ifstream testfile ("test.txt");
ofstream myfile ("myfile.txt");if (testfile.is_open())
{
while ( testfile.good() )
{
getline (testfile,line,';');
myfile << line << endl;
}
}
testfile.close();
}else cout << "Unable to open file";
return 0;
}Aber ich möchte nur die erste Zeile einlesen (nur die Strings) und diese mir alphabetisch sortiert in einer TXT-abspeichern.
Hier brauche ich HILFE
MfG,
Averroes
-
Hallo Averroes,
das geht z.B. mit einem kleinen Helferlein
is_endl, welches hier im Forum schon mehrfach zum Einsatz kam:#include "is_endl.h" // siehe http://www.c-plusplus.net/forum/p1940874#1940874 #include <algorithm> // sort #include <iostream> #include <fstream> #include <vector> #include <string> int main() { using namespace std; vector< string > strings; { // --- Einlesen ifstream testfile("test.txt"); if( !testfile.is_open() ) { cerr << "Fehler beim Oeffnen der Datei" << endl; return -2; } for( string s; !is_endl( testfile ) && getline( testfile, s, ';' ); ) // Lese bis Zeilenende hinter dem ';' strings.push_back( s ); } sort( strings.begin(), strings.end() ); // alphabetisch sortieren { // --- Abspeichern ofstream myfile("myfile.txt"); for( vector< string >::iterator i = strings.begin(); i != strings.end(); ++i ) myfile << *i << endl; } return 0; }Gruß
Werner@Edit: #include <iterator> hinzugefügt (s. Beitrag von Eisflamme)
@Edit2: auf C++03 abgeändert (s. Beitrag von SeppJ)
-
Hi Werner,
ich bekomme folgende Fehlermeldung:
Zeile 22: sort .... "begin was not declared in this scope"
Zeile 26: Invalid type argument of 'unary*'Danke und Gruß,
Averroes
-
Hallo,
versuch es doch mit getline(), um eine Zeile einzulesen und die lib "algorithm" um es dann alphabetisch zu ordnen.
-
HI,
wie meinst du das?
Ich bin noch ein Anfänger
Etwas präzisier
Gruß,
Averroes
-
Also mit getline würde ich die eine Zeile einlesen und in einem String speichern.
Dann könntest du auf Leerzeilen o.ä. prüfen und die einzelnen Wörter in einem Container speichern. Danach kannst du mit der Funktion sort() von "algorithm" deinen Container sortieren und hokus pokus hast du die erste Zeile eingelesen, in einzelne Strings zerteilt und sortiert.
-
Das ist in <iterator> definiert, wobei ich nicht weiß, ob das nicht sowieso implizit eingebunden wird.
Nimm statt begin(strings) einfach strings.begin(), wenn es auch mit include nicht klappt.
Taulinator:
Da fehlt noch, wie man die gelesene Zeile dann wirklich splittet. Aber auch dann ist es ein unnötiger Umweg, der (ohne boost::split) imo auch zu schlechter lesbarem Code führt.
-
Eisflamme schrieb:
Das ist in <iterator> definiert, wobei ich nicht weiß, ob das nicht sowieso implizit eingebunden wird.
Ich tippe eher auf nicht aktivierte C++11-Unterstützung. Wie man C++11 anschaltet kommt auf deinen Compiler an. Steht sicherlich im Handbuch, aber schneller zu finden vermutlich bei Google.
Oder eben den Code umschreiben, so dass er ohne C++11 auskommt, so wie von Eisflamme beschrieben.
-
Eisflamme:
Soweit ich weiss kann man bei getline() auch einen dritten Parameter eingeben(delimiter) und somit splittet man dann den String.EDIT:
getline() benötigt als ersten Parameter einen istream
Sorry
-
SeppJ schrieb:
Ich tippe eher auf nicht aktivierte C++11-Unterstützung.
stimmt - siehe zweiter Fehler in Zeile 26
-
Hi,
Werner und wie aktiviere ich C11 in Xcode unter Mac????
@ Eisflamme, wenn ich aber string.begin() schreiben bekomme ich keine Fehlermeldung, aber das mit Zeile 25 "i" bekomme ich imnmer noch.
Gruß,
Averroes
-
Averroes schrieb:
Werner und wie aktiviere ich C11 in Xcode unter Mac????
@ Eisflamme, wenn ich aber string.begin() schreiben bekomme ich keine Fehlermeldung, aber das mit Zeile 25 "i" bekomme ich imnmer noch.
.. ich habe den Code so verändert, dass er jetzt bei Dir laufen sollte. Siehe oben! (Seite ggf. noch mal aktualisieren)
Gruß
Werner
-
Hi Werner,
dein Code einfach SUPER -->

Danke allen Anderen auch.
Schönen Abend,
Averroes
-
Averroes schrieb:
Werner und wie aktiviere ich C11 in Xcode unter Mac????
C11 gibt's übrigens auch als Programmiersprache (ein Standard von C), ist aber ganz was anderes als C**++**11. Das ist wichtig, wenn man nach den Begriffen googelt.