Datei-Inhalt in Variablen speichern



  • Hallo zusammen,
    Ich hab da mal eine kleine Frage.
    Z.B. gibt es eine Textdatei in welcher ein Name, Alter und und Geschlecht steht (pro Zeile).
    Die Inhalte werden durch ein Komma oder Semikolon oder ein Zeichen getrennt.
    Ich würde gerne den Inhalt in 3 Vectoren
    -vector<int> alter
    -vector<char> Geschlecht
    -vector<string> Name
    speichern.

    Mit getline() kann man zwar die ganze Zeile holen, aber damit komme ich nicht weiter.

    Gruß,
    M



  • @TheDude Du nimmst einen Vektor für eine struct, die die drei Member alter, geschlecht und name hat.

    Den String kannst du mit Stringfunktionen parsen.



  • #include <cstdlib>
    #include <cctype>
    #include <vector>
    #include <string>
    #include <iterator>
    #include <iostream>
    #include <fstream>
    
    struct person
    {
    	static constexpr auto delimiter = ',';
    
    	std::string name;
    	std::string gender;
    	unsigned age;
    };
    
    std::ostream& operator<<(std::ostream &os, person const &p)
    {
    	return os << p.name << " (" << p.gender << ", " << p.age << ')';
    }
    
    std::istream& operator>>(std::istream &is, person &p)
    {
    	std::string name;
    	if (!std::getline(is, name, person::delimiter))
    		return is;
    
    	for (int ch{ is.peek() }; ch != EOF && std::isspace(ch); ch = is.peek())
    		is.get();
    
    	std::string gender;
    	if (!std::getline(is, gender, person::delimiter))
    		return is;
    
    	unsigned age;
    	if (!(is >> age))
    		return is;
    
    	p = person{ name, gender, age };
    	return is;
    }
    
    int main()
    {
    	auto filename{ "foo.txt" };
    	std::ifstream is{ filename };
    	
    	if (!is.is_open()) {
    		std::cerr << "Couldn't open \"" << filename << "\" for reading :(\n\n";
    		return EXIT_FAILURE;
    	}
    	
    	std::vector<person> club{ std::istream_iterator<person>{ is }, std::istream_iterator<person>{} };
    	std::copy(std::begin(club), std::end(club), std::ostream_iterator<person>{ std::cout, "\n" });
    }
    

    foo.txt

    Franz Xaver, male, 42
    Schlumpfine, female, 12
    Hugo Foobar, lol, 45
    

Log in to reply