Funktion zum Einlesen aus Textdateien
-
Guten Tag
Ich habe folgendes Problem. Ich habe eine Textdatei in der ca. 35000 Zahlen stehen. Kommawerte sind mit einem . getrennt und die einzelnen Zahlen durch Leerzeichen bzw. Zeilenumbrüche. Gibt es eine vordefinierte Stadardfunktion mit der ich diese Werte einlesen kann? Ich habe mir selber versucht etwas zusammen zu basteln. Dies ist aber sehr langsam und nicht wirklch effizient. Für Hilfe wäre ich sehr dankbar.
Vielen Dank
-
ein paar mehr infos wären gut
man kann zahlen eig wie in der normalen benutzereingabe per cin auch von dateien einlesen
fstream f("deineDatei.lol"); int val; while ( !f.eof() ) { f >> val; cout << val << endl; }
aber es gibt auch komplexere funktionen wie getline und sowas...
wie gesagt infos wären gut
und dein ansatz
-
sry. War die Tage unterwegs und kam nicht an meinen Quellcode. Hier also mein Ansatz
string zeile; //zum Speichern der einzelnen eingelesenen Zeilen const int ASCIIverschiebung = 48; //Um die Verschiebung bei der Ascii Tabelle auszugleichen const int Leerzeichen = -16; const int Komma = -2; const int Minus = -3; const int KlammerAuf = 43; const int KlammerZu = 45; ifstream scalesstream("scales.txt"); suchwort = "scales"; vector <double> eingelesen; while(getline(scalesstream,zeile)) //zeilenweise einlesen { found = zeile.find(suchwort); if (found!=string::npos) { double wert; //Zum Speichern des kompletten Zellenwertes für die Matrix double zwischenwert; //zum Speichern von zwischendurch eingelesenen Werten int laenge = zeile.length(); bool vorzeichen; for (int i=found+suchwort.length(); i<zeile.length();i++) // die ganze Zeile ablaufen { wert = zeile [i]-ASCIIverschiebung; if (wert != Leerzeichen) //prüfen ob eine Zahl oder ein Leerzeichen { //wenn kein Leerzeichen if (wert == Minus) //überprüfen ob negativew Gewichte vorkommen { vorzeichen = true; //Vorzeichen auf true = minus setzen wert=0; } else vorzeichen = false; int m=i+1; //m ist dazu da um an die richtige stelle zurückzuspringen, wenn die einzulesende Zahl mehrere Stellen hat while (((zwischenwert = zeile[m]-ASCIIverschiebung) !=Leerzeichen) && (m<laenge) ) //prüfen wieviele Stellen die gefundene Zahl hat { //dabei nicht über das Stringende hinauslaufen if (zwischenwert == Komma) //prüfen ob ein Komma (Punkt) gesetzt ist { m++; double stellenwert = 10; while ((zwischenwert = zeile[m]-ASCIIverschiebung) != Leerzeichen && (m<laenge)) //prüfen wieviele Stellen die gefundene Zahl hat { //dabei nicht über das Stringende hinauslaufen wert=wert+(zwischenwert/stellenwert); //Aufaddieren der Werte stellenwert = stellenwert*10; //Stellenwert eins weitersetzen m++; //m erhöhen um auf nächste Stelle zugreifen zu können } } else { wert=wert*10+(zeile[m]-ASCIIverschiebung); //Aufaddieren der Stellenwerte m++; } } i=m; //Setzen der nächsten einzulesen Stelle auf den Wert hinter die letze gefundene Zahl if (vorzeichen) //falls negativ { wert=wert*-1; } eingelesen.push_back(wert); } } } }
in den textdateien steht irgendwo das wort "scales". das wird gefunden und dann werden die nachfolgenden Werte eingelesen. Die Werte sind sind Dezimalzahlen, wobei das Komma als . dargestellt wird. Jetzt interessiert mich ob das ganze auch geschickter geht. Vor allem würde ich gerne nur bis zu einem bestimmten Signalwort einlesen. Finde meine Version sehr übers Knie gebrochen und suche nach etwas eleganterem.
Vielen Dank
-
Also ich würde das mal Wort für Wort einlesen (sofern alles per Abstand getrennt ist).
Dann kannst du ganz einfach mit std::find das erste Vorkommen suchen. Und Anfangen die nächsten Elemente in die gewünschte Form zu extrahieren. (am besten über std::stringstream). Aber vorher noch überprüfen, ob das gewünschte Signalwort vorkommt.in etwa so: (ungetestet)
std::ifstream in ("input.txt"); typedef std::vector<std::string> WordType; WordTypewords; std::string temp; while ( in >> temp ) words.push_back (temp); WordType::iterator it = std::find (words.begin(),words.end(),"scales"); std::list<float> values; while ( *it != "Signalwort") { std::stringstream s; s << *it; float f; s >> f; values.push_back ( f ); ++it; }