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;
    }
    

Log in to reply