Zeilenumbrüche einlesen! Edit String to double



  • Scorcher24 schrieb:

    Slabic schrieb:

    wooow, VIELEN Dank.

    Du glaubst nicht, wie glücklich mich das gerade macht!!^^

    Verstehst du auch was da steht?

    Ja,
    wir lesen jede Zeile aus, speichern sie über getline in line rein.
    Gehen Line mit der schleife durch, ersetzen alle Kommas und fügen eben einen Zeilenumbruch hinzu. Und das wiederholen wir solange noch elemente in der Datei sind. Also iterativ alle Zeilen durchgehen.

    Richtig?

    Ich hatte es ähnlich mit fin.getline(...) versucht gehabt, aber iwas hatte ich wohl falsch gemacht.
    Aber jetzt passts.



  • Slabic schrieb:

    Scorcher24 schrieb:

    Slabic schrieb:

    wooow, VIELEN Dank.

    Du glaubst nicht, wie glücklich mich das gerade macht!!^^

    Verstehst du auch was da steht?

    Ja,
    wir lesen jede Zeile aus, speichern sie über getline in line rein.
    Gehen Line mit der schleife durch, ersetzen alle Kommas. Und das wiederholen wir solange noch elemente in der Datei sind.

    Richtig?

    Richtig.
    Man könnte das ganze jetzt auch noch mit std::string::find_first_of() optimieren, so kann man sich nutzlose cycles sparen. Aber das darfste selber rausfinden. Je nach Größe der Dateien wäre das empfohlen oder sinnlos.



  • Scorcher24 schrieb:

    Slabic schrieb:

    Scorcher24 schrieb:

    Slabic schrieb:

    wooow, VIELEN Dank.

    Du glaubst nicht, wie glücklich mich das gerade macht!!^^

    Verstehst du auch was da steht?

    Ja,
    wir lesen jede Zeile aus, speichern sie über getline in line rein.
    Gehen Line mit der schleife durch, ersetzen alle Kommas. Und das wiederholen wir solange noch elemente in der Datei sind.

    Richtig?

    Richtig.
    Man könnte das ganze jetzt auch noch mit std::string::find_first_of() optimieren, so kann man sich nutzlose cycles sparen. Aber das darfste selber rausfinden. Je nach Größe der Dateien wäre das empfohlen oder sinnlos.

    naja, Es sind nur knapp 250 2stellige zahlen. Daher lohnt es sich wahrscheinlich eher nicht. ^^

    Der Code oben funktioniert ja sogar (logischerweise) bei mehreren Spalten, das ist großartig.

    Gibt es eine Möglichkeiten, bei mehreren Spalten, bestimmte Spalten auszulesen?

    Ich hatte da nur die ignore-funktion gesehen, mit der man sich das evtl. zusammenbasteln kann.

    Geht das auch eleganter?



  • Bestimmte Spalten auslesen ist schon etwas anspruchsvoller. Wenn garantiert immer ein Leerzeichen die Spalten trennt, dann würde ich immer das nächste Leerzeichen suchen und damit die Spalte.



  • Ja, ich hatte das zuerst so versucht, einen Leerzeichen_counter einzusetzen.
    Und dann eben mit modulo immer das entsprechende Element zu erhalten.

    Das hatte aber iwie nicht so ganz geklappt, da hab' ich einfach mit excel die Spalte isoliert. 😃



  • Hallo, nochmal
    kannst du( oder auch wer anders) mir noch helfen, bei der Konvertierung der Daten in double-variablen?

    Also wenn ich das jetzt genauso wieder einlese. Dann hab ich ja den String line.

    Wie konvertiere ich das jetzt in double?

    Atof ?

    Beim Googeln stoße ich auf "Atof ist nicht "gern gesehen" ".

    Grüße



  • Stichwort: Stringstreams

    Lg freeG

    EDIT: hier der Code

    // du ließt deine Zeile in ein String namens line ein
    istringstream in( line );
    double value;
    in >> value;
    


  • Was fr33g sagte.
    Man kann allerdings auch boost::lexical_cast mit boost::tokenizer verwenden:

    while ( !fin.eof() )
    {
        std::string line;
        std::getline(fin, line);
        for ( int i = 0; i < line.length(); i++ )
        {
           if ( line[i] == ',' )
               line[i] = '.';
        }
        // Du sagtest ja, es sind mehrere Spalten durch Leerzeichen getrennt.
        const boost::char_delimiters_separator<char> sep(" ");
        boost::tokenizer<> tokenizer(line, sep);
        boost::tokenizer<>::iterator it = tokenizer.begin();
    
        for ( it; it != tokenizer.end(); it++ )
        {
            try{
               double val = boost::lexical_cast<double>(*it);
            }
            catch (boost::bad_lexical_cast& e)
            {
               // Kein double, fehler behandeln
            }
        }
    
    }
    

    Hab das eben ausm Kopf getippt, sollte aber passen.



  • Ok, danke euch beiden.
    Hat wunderbar geklappt.



  • Slabic schrieb:

    Ich habe eine Liste von Dezimalzahlen(mit Komma getrennt)untereinander und möchte alle kommas in Punkte verwandeln.

    Hallo Slabic,

    was Du eigentlich möchtest ist doch die doubles aus der Datei einlesen - oder? Ein std::istream (und damit auch ein std::ifstream) bietet eine Schnittstelle an, die Darstellung von Zahlen länderüblich anzupassen. Im deutschen wird das ',' als Dezimaltrenner verwendet, also stellt man den istream auf 'deutsch' um.
    Das geht so:

    #include <fstream>
    #include <locale>
    #include <iostream>
    
    int main()
    {
        using namespace std; 
        ifstream fin("Datei.txt");
        fin.imbue( locale("german") ); // der String 'german' kann je nach verwendeter IDE variieren!
        // .. ab hier werden Fließkommazahlen mit ',' als Dezimaltrenner gelesen
        for( double d; fin >> d; ) // jetzt die double ganz normal einlesen
            cout << d << endl;
        return 0;
    }
    

    Scorcher24 schrieb:

    Btw solltest IMHO du auf eof() prüfen und nicht ob ein failbit gesetzt wurde mit good().

    lies Dir doch mal diesen Beitrag durch

    Gruß
    Werner


Anmelden zum Antworten