Problem mit der "Trenn-Schleife"



  • Hallo,

    bei dem gezeigten Programm-Code habe ich das Problem das die "Trenn-Schleife": while (std::getline(word[j], blah, ',')), nur entsprechend der Anzahl der Zeilen in der Textdatei durchlaufen wird, wenn die Variable "word[100]" als Array deklariert wird.
    Die "Trenn-Schleife" wird nur einmal durchlaufen wenn ich nur "word" verwende.
    Wenn ich aber die Variable "word" als Array deklariere, kann ich ja nur eine begrenzte Anzahl von Datensätzen einlesen.
    Wie müsste ich vorgehen damit die Anzahl nicht begrenzt wird ?

    #include <string.h>
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <ostream>
    #include <fstream>
    #include <sstream>
    
    int main()
    {
            std::stringstream word[100];
    	std::string blah;
    	std::string result[10];
    	std::string gelesen;
    	std::ifstream ifs;
            ifs.open(filename, std::ios::in);
    	while (getline(ifs, gelesen))
    	{
    		word[j] << gelesen << std::endl;
    		while (std::getline(word[j], blah, ','))
    		{
    			result[i] = blah;
    			i++;
    		}
    		// Auswertung
                   .......
    		i = 0;
    		j++;
    	}
    	ifs.close();
    }
    

    MfG

    Juergen B.

    M



  • @jbaben sagte in Problem mit der "Trenn-Schleife":

    [...] Datensätzen [...]

    Ja. Datensätze. Wie sieht denn so ein Datensatz aus (= Woraus besteht er) und wie sieht seine Textrepräsentation in Deiner Datei aus?



  • std::istringstream word;
    
        // ...
    
        //word[j] << gelesen << std::endl;
        word.clear();
        word.seekg(0);
        word.str(gelesen);
    
        // ...
    

  • Mod

    @hustbaer sagte in Problem mit der "Trenn-Schleife":

    std::istringstream word;
    
        // ...
    
        //word[j] << gelesen << std::endl;
        word.clear();
        word.seekg(0);
        word.str(gelesen);
    
        // ...
    

    Mit dieser Antwort verstehe ich überhaupt erst endlich, was das Problem vom OP war. Aber wieso diese Antwort, anstatt den Scope von word korrekt einzuschränken? (Und wenn amn schon dabei ist, aller anderen Variablen, womit dann auch so Stilblüten wie blah weniger stinken)



  • @hustbaer
    Hallo,
    vielen Dank für den Hinweis.
    Damit ist mein Problem gelöst.
    Eine Frage hätte ich aber noch: wo kann ich denn so nützliche Hinweise nachlesen ?
    Das Internet weiss ja alles, aber man muß schon den richtigen Suchbegriff verwenden.

    MfG

    Juergen B.


  • Mod

    Wie lernst du denn C++? Ich muss sagen, bisher machte dein Stil den Eindruck von "zusammengegoogeltes Wissen". Besonders wegen des hohen C-Anteils in deinem C++. Die richtige Antwort auf deine Frage wäre nämlich ein gutes Buch, dass dir konsistent die Sprache von Grund auf richtig beibringt. Denn hustbaers Antwort ist eigentlich nur eine Krücke, wie man deinen Code, so wie er ist, retten kann, wohingegen man es eigentlich von Grund auf besser hätte machen können. Aber so ein Gesamtbild wirst du halt nicht aufbauen, indem du einzelne Spezialfälle googelst.



  • @SeppJ
    Hallo,

    Danke für den Hinweis auf die C++ Bücher, deshalb habe ich ja gefragt.
    Das mit dem C-Programm hat den Hintergrund, das ich ein altes vorhandenes Programm mit C++ Code zu ändern.

    MfG

    Juergen B.



  • @SeppJ sagte in Problem mit der "Trenn-Schleife":

    Mit dieser Antwort verstehe ich überhaupt erst endlich, was das Problem vom OP war. Aber wieso diese Antwort, anstatt den Scope von word korrekt einzuschränken? (Und wenn amn schon dabei ist, aller anderen Variablen, womit dann auch so Stilblüten wie blah weniger stinken)

    Ich wollte das nicht vorschalgen weil es u.U. merklich schlechtere Performance hat. Jetzt kann man argumentieren dass das im Programm des OP ziemlich sicher egal ist oder dass man sowieso eher keine iostreams verwenden sollte wenn es auf Performance ankommt - zumindest nicht so wie in diesem Beispiel. Stimmt auch beides. Trotzdem ist das der Hauptgrund.

    Was noch dazukommt ist: ich arbeite selten mit Streams und wusste daher erstmal gar nicht wie man das macht. Daher hat es mich interessiert und ich hab es schnell gegoogelt & ausprobiert. Ich wollte wissen wie man das Problem sozusagen direkt löst - anstatt es zu vermeiden indem man für jede Zeile einen neuen (i)stringstream erzeugt.



  • @jbaben sagte in Problem mit der "Trenn-Schleife":

    Eine Frage hätte ich aber noch: wo kann ich denn so nützliche Hinweise nachlesen ?
    Das Internet weiss ja alles, aber man muß schon den richtigen Suchbegriff verwenden.

    Ich kenne leider keine gute Beschreibung für C++ iostreams. Gibt's sicher irgendwo, aber ich weiss nicht wo. Das einzige was ich dir raten kann ist die Grundlagen der Dinge zu lernen mit denen du arbeitest - in diesem Fall also iostreams. Und wenn du die Grundlagen erstmal kennst, dann solltest du auch verstehen was bei der Ausführung deines Programms überhaupt passiert, und warum es nicht funktioniert: Beim Bearbeiten der 1. Zeile wird das eofbit im Stream word gesetzt. Das bleibt auch gesetzt, obwohl du mehr Daten in den Stream schreibst. Und wenn es gesetzt ist, dann schlagen alle weiteren Versuche aus dem Stream zu lesen sofort fehl - der Stream versucht in dem Fall nichtmal weitere Daten aus dem Stream-Buffer zu lesen. Und wenn du das weisst kannst du googeln wie man das eofbit eines Streams zurücksetzen kann. Und so findest du dann die clear Funktion.

    Der Rest ist bloss eine Optimierung: anstatt die nächste Zeile an den Stringstream anzuhängen, macht es mehr Sinn den Inhalt des Streams mit der nächsten Zeile zu überschreiben. Das spart Speicher und auch etwas Laufzeit. Das wird mit dem seekg(0) und str(gelesen) erreicht.


Log in to reply