String teilen und in Variable speichern



  • Hallo,

    bei dem gezeigten Programm-Code wird der String ("$,00,01,=,79") durch das ',' geteilt.

    #include <sstream>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
       stringstream word;
        word << "$,00,01,=,79" << endl;
        string blah;
        string result[10];
        string::size_type sz;
        int i = 0, row = 0, column = 0, quantity = 0;
        while (getline(word, blah, ','))
        {
            cout << blah << endl;
            result[i] = blah;
            i++;
        }
        row = stoi(result[1], &sz);
        column = stoi(result[2], &sz);
        quantity = stoi(result[4] ,&sz);
        cout << "Row = " << row << endl;
        cout << "Column = " << column << endl;
        cout << "Sign = " << result[3] << endl;
        cout << "Quantity = " << quantity << endl;
    }
    

    Meine Frage lautet: kann ich den String auch ohne Trennzeichen (',') teilen?
    Meine Lösung wäre durch zusammenfügen der einzelnen Zeichen.
    Z.B.: row = word[1] + word[2];
    column = word[3] + word[4];
    sign = word[5];
    quantity = word[6] + word[7];
    Dabei weiss ich aber nicht wie ich die beiden Zeichen zusammenfügen kann,
    um dann das Ergebnis in Integer umzuwandeln.

    MfG
    Juergen


  • Mod

    Meinst du so?

        stringstream word;
        word << "$ 00 01 = 79" << endl;
        char dollar, sign;
        int row, column, quantity;
        word >> dollar >> row >> column >> sign >> quantity;
        cout << "Row = " << row << endl;
        cout << "Column = " << column << endl;
        cout << "Sign = " << sign << endl;
        cout << "Quantity = " << quantity << endl;
    

    Hätte auch den Vorteil, dass das Format flexibler ist, "$0 1=79" (und viele andere Variationen) würde damit auch geparsed. (Abgesehen vom anderen Vorteil, dass der Code massiv kürzer und einfacher ist)



  • @SeppJ
    Hallo,
    vielen Dank für Deine schnelle Ausführung.
    Das ist natürlich der richtige Weg.
    Ich habe das aber wieder einmal anders gedacht: Mein String sollte so aussehen: "$0001=79".

    MfG

    Juergen B.



  • @jbaben sagte in String teilen und in Variable speichern:

    row = word[1] + word[2];

    Meinst du sowas:

    int row = 10 * (word[1] - '0') + (word[2] - '0');
    

    Man sollte aber vielleicht vorher testen, dass das auch beides Ziffern sind (https://en.cppreference.com/w/cpp/string/byte/isdigit)


  • Mod

    @jbaben sagte in String teilen und in Variable speichern:

    Ich habe das aber wieder einmal anders gedacht: Mein String sollte so aussehen: "$0001=79".

    Danke für das verschwenden von jedermanns Zeit durch das Stellen ungenauer Fragen 🙄

    Man könnte sich hier natürlich eine toll durchgedachte Lösung zum Lesen von Zahlen mit genau N Ziffern ausdenken. Oder man nimmt kurz Abstand und kommt auf ein ganz einfaches

        word >> dollar >> number >> sign >> quantity;
        row = number / 100;
        column = number % 100;
    


  • Hallo,

    vielen Dank für Eure hilfreichen Hinweise.
    Ich habe jetzt zwei Möglichkeite meinen String zu teilen.
    Ich habe aber jetzt noch das Problem die Strings aus einer Textdatei auszulesen und diese dann an "stringstream word" zu übergeben.

    #include <sstream>
    #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
    stringstream word1, word2;
    	word1 << "$ 00 01 = 79" << endl;
    	word2 << "$0001=79" << endl;
    	char dollar, sign;
    	int row, column, quantity, number;
    
    


  • Hallo,
    vielen Dank für Eure hilfreichen Hinweise.
    Ich habe aber jetzt noch das Problem wie ich die ausgelesenen String aus einer Textdatei an "stringstream word" zu übergeben.

    #include <sstream>
    #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
    
    	stringstream word;
    	char dollar, sign;
    	int row, column, quantity, number;
           string gelesen;
    	ifstream fileIn;
    	string filename = "hmenue";
    	fileIn.open(filename, ios::in);
    	if (!fileIn)
    		cout << "Could not read File" << " " << filename << " !" << endl;
    	else
    	{
    		while (getline(fileIn, gelesen))
    		{
    			cout << gelesen << endl;
    			word >> dollar >> number >> sign >> quantity;    // ????
    			row = number / 100;
    			column = number % 100;
    			cout << "Row = " << row << endl;
    			cout << "Column = " << column << endl;
    			cout << "Sign = " << sign << endl;
    			cout << "Quantity = " << quantity << endl;*/
    		}
    	}
    	fileIn.close();
    	cout << "Eingabe erwartet" << endl;
    	cin.get();
    	return 0;
    }
    

    Bei dieser Version wird nur der erste String ("$0001=79") geteilt und angezeigt.
    Die Datei "hmenue" sieht z.B. so aus:
    $0001═79
    $2301═79
    $2101═79
    $0201═79
    #0000║2
    $0200╠1
    #0200║19
    $2100╠1
    $2200║1
    #0079║2
    $0279╣80
    #0379║19
    $2179╣80
    $2279║80
    $0000╔1
    $2300╚1
    $0079╗80
    $2379╝80
    MfG

    Juergen B.



  • Solange jede Zeile der Datei das gleiche Format hat, kannst du direkt daraus die Daten extrahieren:

    while (fileIn >> dollar >> number >> sign >> quantity)
    {
      // ...
    }
    


  • @Th69 sagte in String teilen und in Variable speichern:

    Solange jede Zeile der Datei das gleiche Format hat, kannst du direkt daraus die Daten extrahieren:

    while (fileIn >> dollar >> number >> sign >> quantity)
    {
      // ...
    }
    

    Damit kann ich die genannte Datei (mit gleichem Format) auslesen.

    Ich möchte aber noch die genannte Datei noch mit einem weiteren Format erweitern:
    Z.B.: "* File : hmenue.msk" und "e0105 wort1 wort2 .... wortx"
    D.h. ich muss das erste Zeichen auslesen und dann den Rest der Zeile entsprechend aufteilen ("if(dollar == '')...., bzw. ("if(dollar == 'e')....).
    "
    File : hmenue.msk" --> Kommentar
    "e0105 wort1 wort2 .... wortx" --> Zeile = 1,Spalte = 5, Rest = Anzeigetext

    MfG

    Juergen B.



  • Hallo,
    mit dem gezeigten Programm-Code kann ich die entsprechende Textdatei auslesen.

    #include <iostream>
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <sstream>
    #include <sstream>
    #include <fstream>
    #include <string>
    
    int main() {
    	std::string s;
    	std::string filename = "hmenue.msk";
    	char sign = '\0';
    	char dollar = '\0';
    	int row = 0, column = 0, quantity = 0, number = 0;
    	system("color 96");			// Hintergrund = blau
    
    	// 1. Textdatei zum lesen oeffnen
    	fstream infile(filename);
    	if (infile.bad())
    	{
    		std::cout << "Error File " << filename << std::endl;
    		exit(1);
    	}
    	// 2. das erste Zeichen aus Textdatei auslesen
    	dollar = infile.get();
    	// 3. das erste Zeichen auswerten und Rest der Zeile auslesen
    	while (dollar != EOF)
    	{
    		if (dollar == '*')		// Kommentar
    		{
    			std::getline(infile, s);
    		}
    
    		if (dollar == '$')		// Zeichen waagerecht
    		{
    			std::getline(infile, s);
    			std::string str(s);
    			std::istringstream iss(str);
    			iss >> number >> sign >> quantity;
    			row = number / 100;
    			column = number % 100;
    			std::cout << "Row = " << row << endl;
    			std::cout << "Column = " << column << endl;
    			std::cout << "Sign = " << sign << endl;
    			std::cout << "Quantity = " << quantity << endl;
    		}
    
    		if (dollar == '#')		// Zeichen senkrecht
    		{
    			std::getline(infile, s);
    			std::string str(s);
    			std::istringstream iss(str);
    			iss >> number >> sign >> quantity;
    			row = number / 100;
    			column = number % 100;
    			std::cout << "Row = " << row << endl;
    			std::cout << "Column = " << column << endl;
    			std::cout << "Sign = " << sign << endl;
    			std::cout << "Quantity = " << quantity << endl;
    		}
    
    		if (dollar == 'e')		// Anzeige Text
    		{
    			char zeile[3], spalte[3], text[80];
    			infile.get(zeile, 3);
    			infile.get(spalte,3);
    			infile.get(text, 80);
    			row = atoi(zeile);
    			column = atoi(spalte);
    			std::cout << "Row = " << row << endl;
    			std::cout << "Column = " << column << endl;
    			std::cout << "Text = " << text << endl;
    			
    		}
    		dollar = infile.get();
    	}
    	infile.close();
    	cout << "Eingabe erwartet" << endl;
    	cin.get();
    	return 0;
    }
    

    MfG

    Juergen B.


Anmelden zum Antworten