int Matrix aus Datei einlesen und pro Zeile ein Objekt erstellen



  • Hallo zusammen,
    ich hoffe jemandem ist so kurz vor Weihnachten langweilig und kann mir kurz sagen was ich falsch mache😀

    Die Überschrift sagt eigentlich alles. Folgende Datei ist gegeben:

    25	17	10	189
    10	15	10	162
    5	16	10	171
    10	15	12	180
    15	9	11	108
    10	7	28	207
    8	7	16	99
    10	6	16	90
    25	10	18	225
    25	12	18	243
    10	5	40	315
    60	40	5	243
    5	25	30	810
    50	1	60	72
    

    Ich möchte pro Zeile ein Objekt erstellen, mit der jeweiligen Zahl als Attribut.
    Das ist mein code:

    
    typedef unsigned int uint;
    
     void read(string filename) {
    
       ifstream str (filename.c_str());    
       string line;
       while (getline(str, line)) {
       
       istringstream is(line);
          
       uint _gewicht,_nutzen,_anzVor,_anzKna;
       
    //Wenn ich diese Zeile auskommentiere läuft das Programm 
    //ansonsten nicht
       is >> _gewicht >> _nutzen >> _anzVor >> _anzKna;
      
        Paket temp; 
        temp.setValues(_gewicht,_nutzen,_anzVor,_anzKna);    
        rucksack.pakete.push_back(temp);
    
    //Hier habe ich nur was probiert
    //is.str("");
    //is.clear(); // Clear state flags.
    //is.seekg(0);
        
       }
    
        
    } 
    

    Villeicht ist der Ansatz auch falsch bzw. nicht optimal. Aber mit fällt leider nichts besseres ein.
    Vielen dank schonmal😊



  • @Philipp2706 sagte in int Matrix aus Datei einlesen und pro Zeile ein Objekt erstellen:

    rucksack

    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <iterator>
    
    struct Paket {
    	int gewicht, nutzen, anzVor, anzKna;
    };
    
    struct Rucksack {
    	std::vector<Paket> pakete;
    };
    
    std::istream& operator>>(std::istream &is, Paket &paket)
    {
    	Paket temp;
    	if (is >> temp.gewicht >> temp.nutzen >> temp.anzVor >> temp.anzKna)
    		paket = temp;
    	return is;
    }
    
    int main()
    {
    	char const *filename = "test.txt";
    	std::ifstream is{ filename };
    	if (!is.is_open()) {
    		std::cerr << "Couldn't open \"" << filename << "\" for reading :(\n\n";
    		return EXIT_FAILURE;
    	}
    
    	Rucksack rucksack;
    	rucksack.pakete = std::vector<Paket>{ std::istream_iterator<Paket>{ is },
    										  std::istream_iterator<Paket>{} };
    }
    

    und fertig ist der Lack.


Anmelden zum Antworten