Datei-> Spalte suchen , finden und die komplette Zeile ausgeben



  • Carlos_Hafensänger schrieb:

    #include <regex>
    #include <fstream>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        regex expr(
                   R"(([A-Z0._%+-])",regex_constants::icase);
    
        string line, fname;
    
        cout <<"Dateiname angeben:";
        getline(cin, fname);
        ifstream file(fname);
        if(!file){return -1;}
    
        smatch m;
    
        while(getline(file,line))
        {
            if(regex_search(line,m,expr))
            {
                if(m.size() == 1)
                {
                    cout << "Angabe:" << m.str(0) <<endl;
                }
            }
        }
    }
    

    Leute ich sehe mein Fehler nicht ?! der compiliert es mir nicht
    AUSGABE : "terminate called after throwing an instance of 'std::regex_error'
    what(): regex_error"

    zu meinem Hauptproblem:
    (steht im Titel)

    Mod-Edit: Code-Tags.

    Die Exception wird geworfen, weil dein Regex-Ausdruck nicht korrekt ist (sie wird beim Ausführen des Programms geworfen, dann ist der Kompiliervorgang abgeschlossen).

    Th69 hat dich schon auf die richtige Spur gebracht mit seiner Frage nach den zwei Klammern zu Beginn, denn es wird nur eine geschlossen.
    Falls du es nicht weisst; mit R"()" wird ein String-Literal angegeben, welches "raw" ist und nicht escaped werden muss/darf (der eigentliche String kommt zwischen die Klammern). Wobei die Klammern Geschmacksache sind - man könnte AFAIK auch ein anderes Zeichen nehmen (oder sogar mehrere), z. B. R"**" (der eigentliche String kommt zwischen die Sterne).



  • Wobei die Klammern Geschmacksache sind - man könnte AFAIK auch ein anderes Zeichen nehmen (oder sogar mehrere), z. B. R"**" (der eigentliche String kommt zwischen die Sterne).

    C++ ist nicht Perl, wo man String mit q(string), q!String!, q<String>, q*String* usw. erzeugen kann.

    In C++ kommt der String zwischen die Klammern!

    R" + irgendwas + ( + eigentlicher String + ) + irgendwas_wiederholt + ";
    d.h. folgendes ist identisch:

    std::cout << R"(hallo welt)" << '\n';
    std::cout << R"x(hallo welt)x" << '\n';
    std::cout << R"blubberdieblubb(hallo welt)blubberdieblubb" << '\n';
    std::cout << R"*+45(hallo welt)*+45" << '\n';
    std::cout << R"""""(hallo welt)""""" << '\n';
    

    Man suche sich davon das lesbarste heraus 😉



  • wob schrieb:

    ...

    Hab ich ja geschrieben. Aber danke für die detailliertere Ausführung.

    Edit: Ok, ich habe nicht genau das geschrieben, was du jetzt hervorgehoben hast.
    Edit2: I agree.



  • Carlos_Hafensänger schrieb:

    Wieso kann ich die Schleife ausführen wenn ang ein integer ist und bei String , gibt er mir eine Fehlermeldung aus .
    Verstehe ich echt nicht

    string.find() gibt die Position des gesuchten Teilstrings zurück

    In deiner Bedingung steht:

    if(ang=line.find(a)...
    

    Das "=" ist eine Zuweisung. Das Ergebnis von find() wird also "ang" zugewiesen und das geht nicht, wenn "ang" ein string ist.

    Du willst vermutlich vergleichen. Das geht mit "==".



  • Sorry , dass ich so spät zurück schreibe .
    Danke nochmals für die Hilfe

    Hab es jetzt lösen können.

    while(getline(Myfile,line))
               {
                   istringstream stream(line);
                   vector<string>column;
                   string element;
    
                   while(getline(stream,element,'\t'))
                   {
                       column.push_back(element);
                       if(((offset = element.find(suchen,0))) != string::npos)
                        {
                           // cout <<"Wort gefunden:\n" << suchen<<"\n"<<element << endl;
    
                        }
                   }
    
               }
    

    Nun habe ich das Problem:
    ich kann jetzt nach einem Wort suchen und auch die entsprechende Zeile ausgeben , nur leider würde ich gerne die Spalten der Zeile , die durch ein Kommata getrennt sind , in einzelne Variablen speichern um beispielsweise von einigen bestimmen Spalten den Average ausrechnen zu können



  • Carlos_Hafensänger schrieb:

    Nun habe ich das Problem:
    ich kann jetzt nach einem Wort suchen und auch die entsprechende Zeile ausgeben , nur leider würde ich gerne die Spalten der Zeile , die durch ein Kommata getrennt sind , in einzelne Variablen speichern um beispielsweise von einigen bestimmen Spalten den Average ausrechnen zu können

    Der Suchbegriff ist "split string". Da sollte es einige Ergebnisse dazu geben...



  • danke 😃

    habe es so weit wie möglich geschafft und nun wollte ich int in string umwandeln mit to_string, habe auch mal ein wenig im Internet mich schlau gemacht , leider nichts gefunden.
    Ich zeige euch mal mein Codeschnipsel

    //calc average
            int length = searchResults.size();
            vector<string> result;
            double secondRow = 0;
            double thirdRow = 0;
            for (vector<string> line : searchResults) {
                secondRow += atoi(line.at(1).c_str());
                thirdRow += atoi(line.at(2).c_str());
            }
    
            //Resultat zusammensetzten
            result.insert(result.begin(), suchen);
            result.insert(result.end(),to_string(secondRow / length));
            result.insert(result.end(),to_string (thirdRow / length));
    

    die dreizehnten Zeile wird mir als Fehler angezeigt , die Meldung : to_string was not declared in this Scoop

    Leider finde ich mei Fehler nicht , habe auch include <sstream>


  • Mod

    to_string benötigt den Header <string>



  • Habe ich auch im Header , trotzdem geht es nicht



  • C++ 11 einschalten oder neueren Compiler installieren.



  • Habe den Compiler :
    GNU GCC Compiler
    Have g++ follow the C++11 ISO C++ language Standard [std=c++11]



  • Carlos_Hafensänger schrieb:

    Habe den Compiler :
    GNU GCC Compiler

    Dir ist aber schon aufgefallen, dass Software (aus gutem Grund) eine Versionsnummer hat?

    manni66 schrieb:

    C++ 11 einschalten oder neueren Compiler installieren.



  • Muss echt gestehen , dass ich gerade etwas verwirrt bin .
    Ich dachte der Compiler wäre der aktuellste und somit auch der Mächtigste.
    Könntest du es noch einmal für Dummies erläutern , falls du die Zeit dafür hast
    DANKEE 😃



  • Carlos_Hafensänger schrieb:

    Könntest du es noch einmal für Dummies erläutern

    Hat er doch schon...

    Deine Reaktion darauf war:

    Muss echt gestehen , dass ich gerade etwas verwirrt bin .

    Versteh nicht was genau du noch willst?



  • was mich verwirrt ist die Tatsache, dass ich den C++ Compiler eingeschaltet habe
    ich weiss echt nicht ,wie ich es sonst angehen sollte.



  • Carlos_Hafensänger schrieb:

    Muss echt gestehen , dass ich gerade etwas verwirrt bin .
    Ich dachte der Compiler wäre der aktuellste und somit auch der Mächtigste.
    Könntest du es noch einmal für Dummies erläutern , falls du die Zeit dafür hast
    DANKEE 😃

    https://gcc.gnu.org/releases.html

    Und welches Release hast du bei dir installiert?



  • GCC 6.3
    Ich gehe mal stark davon aus, dass ich 7.1 auf CodeBlocks installieren sollte



  • GCC 6.3 ist auf jeden Fall neu genug für C++11.
    Siehe https://gcc.gnu.org/onlinedocs/gcc-6.3.0/gcc/Standards.html#Standards

    GCC supports the original ISO C++ standard published in 1998, and the 2011 and 2014 revisions.

    (...)

    The default, if no C++ language dialect options are given, is -std=gnu++14.

    Wahrscheinlich gibt es in deiner IDE irgendwo einen Schalter zur Auswahl des Sprachstandards. Dein gcc jedenfalls beherrscht jedenfalls C++14 und wählt diesen Standard sogar per Default aus (plus gcc-Erweiterungen).



  • Danke
    Ich habe mal etwas geguckt leider nichts gefunden , ich hoffe mal das ich noch fündig werde



  • weg von der Fragestellung
    es wäre doch auch einfach möglich ,wenn ich eine andere Funktion dafür einsetze
    bspw

    -> stringstream ss;
    ss << number;
    string numberasstring(ss.str());

    ist die Funktion zu laienhaft ?


Anmelden zum Antworten