ifstream zeile steuern?



  • hi,

    meine datei ist so aufgebaut:

    x MeinText, Hallo, Samuel
    usw..
    

    nun will ich, dass was nach dem "x" steht steuern und in meine struktur einfügen, also dann so:

    ...
    struct Einlesen
    {
    std::string Text;
    std::string User;
    std::string Schrift;
    };
    ...
    Einlesen MeineDatei;
    // jetzt soll z. b. "Hallo" an MeineDatei.User weitergegeben werden
    // dann soll z. b. "Samuel" an MeineDatei.User übergeben werden usw...
    

    also so, dass ich genau steuern kann, welcher inhalt der zeile an welche variable weitergegeben wird.

    danke schonmal

    p. s.: meine datei hat immer das gleiche muster
    also:

    x bla,blabla,bla2
    


  • Ganz schlau werd ich zwar noch nicht aus deinem Post, aber schau dir mal string::find() und string::substr() an.



  • sry, habs ein bisschen verwirrend geschildert:

    also mit .find() such ich die "x" zeile(n) raus, nun will ich was nach dem x in meine struktur einfügen



  • Also etwa so (ohne Validierung der Zeilen)?

    struct Einlesen		// schlechter Name
    {
    	explicit Einlesen(string arg)
    	{
    		vector<string> args = getArgs(arg.substr(2));
    		Text = args[0];
    		User = args[1];
    		Schrift = args[2];
    	}
    
    private:
    
    	vector<string> getArgs(string line)
    	{
    		vector<string> args;
    		string::size_type pos1 = 0;
    		string::size_type pos2 = line.find(",");
    
    		while(pos2 != string::npos)
    		{
    			args.push_back(line.substr(pos1, pos2 - pos1));
    			pos1 = pos2 + 2;
    			pos2 = line.find(",", pos1);
    		}
    
    		return args;
    	}
    
    	string Text;
    	string User;
    	string Schrift;	// Was soll das sein?
    };
    


  • Vielen Dank, aber ich brauch das mit Validierung, weil es mehrere "x"-Zeilen gibt



  • Naja, die Validierung sollte hier ja schnell gehen:

    #include <algorithm>
    
    bool isLimiter(char arg)
    {
        return arg == ',' && *(&arg + 1) == ' ';
    }
    
    if(args.substr(0, 2) != "x " || count(args.begin(), args.end(), isLimiter) != 2 || args[args.length() - 1] == ',' || arg[2] == ',')
        passt nicht;
    


  • Oder du baust dir nen regulären Ausdruck zusammen.



  • samuelb. schrieb:

    Vielen Dank, aber ich brauch das mit Validierung, weil es mehrere "x"-Zeilen gibt

    musste die struktur immer bis x einlesen und gucken, ob alle strukturelemente nen sinnvollen inhalt bekommen haben.



  • danke Michael E., aber ich hab da noch ein Problem: ich will jetzt die inhalte der datei (also nach "x") in eine for-schleife einfügen, also ungefähr so:

    for(int i = 0; i < 3; i++)
    {
    echo << Text[i] << endl;
    echo << User[i] << endl;
    echo << Schrift[i] << endl;
    }
    


  • Genau andersrum:

    vector<Einlesen> myObjects;
    for(int i = 0; i < myObjects.size(); ++i)
    {
        cout << myObjects[i].Schrift;
        etc.
    }
    

Anmelden zum Antworten