Funktion um bestimmtes Format einzulesen



  • Hallo
    Ich habe probierte eine Funktion zu schreiben, die ein bestimmtes Format aus einer Datei einliest.
    Das Format:

    1
    house-haus
    1
    tree-baum
    2
    car-auto
    

    Die Funktion:

    void read(std::fstream& f)
    {
    	std::string s;
    	std::string m;
    	int unit;
    
    		getline(f,s);
    
    		if(!isalpha(static_cast<unsigned char>(s[0])))
    		{
    			std::stringstream kon(s);
    			kon >> unit;
                             ...
    			getline(f,s);
    		}
    
    		if(isalpha(static_cast<unsigned char>(s[0])))
    			{
    			m = s.substr(0,s.find_first_of("-"));
                              ...
    
    			s = s.substr(s.find_first_of("-")+1);
                              ...
    			}
    }
    

    Hier noch der Aufruf der Funktion:

    std::fstream file;
    
    	file.open("Datei.txt", std::ios::in);
    
    	while(file.good())
    	{
    		read(file);
    		...
    	}
    
    	file.close();
    

    Die Funktion funktioniert so weit aber die erste Zahl die in der Datei steht wird nicht richtig eingelesen (also welche im bsp. oben über der Vokabel "house" steht).
    Findet jmd den Fehler?
    Danke 🙂



  • Wenn zwischen den Texten immer genau ein '-' steht, dann geht das z.B. so:

    void read( std::istream& f ) // std::(I)stream
    {
        int unit;
        std::string m,s;
        while( std::getline( std::getline( f >> unit >> std::ws, m, '-' ), s ) )
        {
            std::cout << unit << ") " << m << "-" << s << std::endl;
            // ...
        }
        if( f.eof() ) // bis Ende gelesen
        {
            std::cout << "alle gut" << std::endl;
        }
    }
    
    // im main
        std::ifstream file("Datei.txt"); // (I)fstream
        if( !file.is_open() )
        {
            cerr << "problem.." << endl;
            return -2; // break;
        }
        read( file );
    


  • lolipoplols Code funktioniert bei mir.



  • lolipoplol schrieb:

    Die Funktion funktioniert so weit aber die erste Zahl die in der Datei steht wird nicht richtig eingelesen (also welche im bsp. oben über der Vokabel "house" steht).
    Findet jmd den Fehler?

    vielleicht steht in der Datei vor der '1' eine Leerzeile. Was steht genau in dem ersten String 's' - gib das doch einfach mal aus.


  • Mod

    Von solchen Schleifen bekomme ich Zahnschmerzen

    while( std::getline( std::getline( f >> unit >> std::ws, m, '-' ), s ) )
    

    Warum nicht einfach barmherzig sein?

    for(;;)
    {
    	f >> unit >> std::ws;
    	std::getline(f, m, '-');
    	if( !std::getline(f, s) )
    		break;
    
    	// ....
    }
    

    Oder anders, aber wenigstens die Funktionsaufrufe auf eigene Zeilen und Statements auslagern.


Anmelden zum Antworten