W
Blackskyliner schrieb:
..., wobei die Zahlen auch in entsprechende double oder int Variablen gespeichert werden?
Hallo Blackskyliner,
wenn Du Zahlen willst, so solltest Du auch Zahlen lesen. Oder allgemeiner: lese das, was Du nachher haben willst.
Blackskyliner schrieb:
Kann man das irgendwie über fstream.read() lösen??
Nein, dass ist u.U. die schlechteste aller denkbaren Lösungen, denn die Methode 'read' liest unformatiert. Genau wie getline; wobei getline hier Sinn macht, um den ersten Namen bis zum '|'-Zeichen zu lesen, wie ipsec schon erwähnt hat.
.. ach so, und wenn man Studenten haben will, so sollte man Studenten lesen. Dazu baut man sich für die Struktur seiner Wahl:
struct tStud
{
std::string name;
int matrikel, beleg, pruef;
};
Streaming-operatoren für das Einlesen und Ausgeben.
std::istream& operator>>( std::istream& in, tStud& stud );
std::ostream& operator<<( std::ostream& out, const tStud& stud );
Implementierung kommt später (s.u.)
So ausgerüstet lassen sich jetzt die Studenten aus der Datei lesen:
int main()
{
using namespace std;
vector< tStud > studenten;
ifstream f( "test2.txt" );
for( tStud student; f >> student; )
studenten.push_back( student );
if( f.eof() ) // bis 'End Of File' gelesen -> dann ist alles iO.
{
// alles richtig gelesen; hier weiter machen
copy( studenten.begin(), studenten.end(), ostream_iterator< tStud >( cout, "\n" ) );
cout << endl;
}
return 0;
}
.. jetzt 'nur' noch die Implementierung, um einen(!) Studenten zu lesen und zu schreiben. Den Namen mit getline(...,'|') lesen und die int als int lesen. Bleiben nur noch die (lästigen) '|'-Zeichen zwischen den Zahlen. Ein Leerzeichen wäre hier die bessere Wahl gewesen.
std::istream& pipe( std::istream& in ) // liest das '|'-Zeichen; falls keines kommt, geht der Stream in den Fehlerzustand
{
char c;
if( in >> c && c != '|' )
in.setstate( std::ios_base::failbit );
return in;
}
std::istream& operator>>( std::istream& in, tStud& stud ) // Student einlesen
{
// Format z.B.: "dsa|4|5|6"
return getline( in >> std::ws, stud.name, '|' ) >> stud.matrikel >> pipe >> stud.beleg >> pipe >> stud.pruef;
}
std::ostream& operator<<( std::ostream& out, const tStud& stud ) // Student ausgeben
{
const char pipe = '|';
return out << stud.name << pipe << stud.matrikel << pipe << stud.beleg << pipe << stud.pruef;
}
Die notwendigen includes sind:
#include <algorithm> // copy
#include <fstream>
#include <iostream>
#include <iterator> // ostream_iterator
#include <string>
#include <vector>
Gruß
Werner