Nach einem bestimmten Zeichen den restlichen Satz ausgeben



  • Hallo liebe Leute,

    ich brauche unbedingt eure Hilfe, da ich nicht mehr weiterkomme und schon allmählich verzweifle. Umso mehr hoffe ich das ihr mir weiterhelfen könnt.
    Und bitte seid lieb zu mir, ich bin Anfänger im Programmieren.

    Also zur Aufgabenstellung, ich möchte ein Programm schreiben, dass eine Datei einliest und ab dem Beginn eines bestimmten Zeichens (in meinem Beispiel ///) den restlichen Satz(dieser auch Leerzeichen beinhaltet) aus der Datei ausgibt.

    Dies bekomme ich nicht hin :(. Ich kann mir nur das folgende Wort ausgeben lassen und nicht den ganzen restlichen Satz bis zum Zeilenende.

    Zudem möchte ich dann noch einen Textausschnitt aus der Datei der in "..." steht ausgeben lassen. Und dieser Textausschnitt soll dann mit dem zuvorigen Zeilenende zusammen ausgegeben werden, da diese zusammengehören.

    Ein Beispiel:

    /// Anfang des Programms
    #define DES_PROG_BGN "BGN"

    Somit soll das ausgegeben werden -> "BGN" = Anfang

    Ich hoffe ihr habt verstanden was ich meine^^.

    Mein Code sieht momentan so aus:

    #include <iostream>
    #include <fstream>
    #include <limits>
    #include <string>

    using namespace std;

    int main(int argc, char *argv[]){
    ifstream file;
    string nachfolgender_text;
    char buchstabe;
    char wait;

    // Datei öffnen
    file.open("text.txt", ios::in);

    if (file.good()){
    // Wenn die Datei geoeffnet werden konnte...
    // An den Anfang der Datei springen
    file.seekg(0L, ios::beg);

    while (! file.eof()){
    // Die Datei zeilenweise auslesen
    file.get(buchstabe);

    while( file.ignore( numeric_limits< streamsize >::max(), '#' ) >> nachfolgender_text ){
    cout << "da steht: " << nachfolgender_text << endl;
    }
    }
    cout << endl;
    }
    else{
    // Wenn die Datei nicht geoeffnet werden konnte,
    // aus welchen Gruenden auch immer...
    cout << "Datei nicht gefunden." << endl;
    }
    cin.get(wait);
    return 0;
    }

    Ich würde mich über jegliche Tipps und Verbesserungsvorschläge eurerseits sehr freuen :).

    Vielen Dank im Voraus!

    LG



  • Editier mal bitte deinen Eintrag und pack es in Code tags und formatier mal die den Code und die geschweiften Klammern.



  • #include <iostream>
    #include <fstream>
    #include <limits>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char *argv[]){
        ifstream file;
        string nachfolgender_text;
        char buchstabe;
        char wait;
    
        // Datei öffnen
        file.open("text.txt", ios::in);
    
        if (file.good()){
           // Wenn die Datei geoeffnet werden konnte...
           // An den Anfang der Datei springen
           file.seekg(0L, ios::beg);  
    
           while (! file.eof()){
                 // Die Datei zeilenweise auslesen
                 file.get(buchstabe);
    
                while( file.ignore( numeric_limits< streamsize >::max(), '#' ) >> nachfolgender_text ){
                       cout << "da steht: " << nachfolgender_text << endl;
                }
           }
           cout << endl;
        }
        else{
             // Wenn die Datei nicht geoeffnet werden konnte
             cout << "Datei nicht gefunden." << endl;
        }
    
        cin.get(wait);
        return 0;
    }
    


  • Kannst Du vielleicht ein Beispiel-Text posten?
    Mir ist nicht ganz klar wie ein Satz begrenzt ist.
    Gibt es in jeder Zeile nur einen Satz oder kann ein Satz zeilenübergreifend sein und der durch ".", "!", "?" begrenzt wird?

    Mein Konstrukt zum File-lesen würde eher so aussehen, aber ich bin echt kein iostream Experte und mich kann man mit iostreams eigentlich quer übers Feld jagen. 🙄

    int main()
    {
      std::string str;
      ifstream file("text.txt");
    
      if (!file.is_open())
          //error handling here
    
      while(file.getline(str))
      { 
       //insert parsing here
      }
    
    }
    


  • Also wenn ich das richtig verstehe, hast du pro Zeile: <irgendwas> <zeichen> <rest>
    <rest> willste haben. Soweit richtig?

    while (std::getline(file.ignore( numeric_limits< streamsize >::max(), '#'), str))
       std::cout << str << '\n';
    

    (ungetestet)
    Diese zwei Zeilen sind deine ganze Lese Routine.



  • Das ist doch eher eine Aufgabe für sed oder so. Warum willst Du das in C++ machen?

    Ohne sed -Expertenwissen:

    sed -n -e '/^\/\{3\}/ N; s/^\/\{3\}\(.*\)\n[^"]*\("[^"]*"\)/\2=\1/p' test.dat
    


  • Vielen lieben Dank für die Zeit die ihr euch genommen habt mir zu antworten :*!
    Dadurch bin ich schon ein gutes Stück voran gekommen :)!

    Dank Nathan kann ich nach einem bestimmten Zeichen (in meinem Beispiel 😵 jetzt schon mal bis zum Zeilenende die kompletten folgenden Zeichen ausgeben.

    Jedoch möchte ich diese Zeile noch verknüpft mit ein paar anderen Zeichen ausgeben diese stehen in zwei Anführungszeichen. ---> "zeichen"

    Ich gebe euch mal ein Beispiel wie die Textdatei aussieht.

    -----> /// Anfang des Programms
    #define DES_PROG_BGN "BGN"

    /// Ende des Programms
    #define DES_PROG_END "END"

    /// Prüfung der Daten beginnt.
    #define PRÜF_DER_DATEN "PRÜF"

    /// Prüfung der Daten beginnt.
    /// Daten werden dazu eingelesen.
    #define DATEN_EINLESEN "DATEN"

    So stehen ungefähr 100 dieser Datensätze in der Textdatei.

    Mittels des Programms möchte ich erzeugen dass am Ende in der Konsole das ausgegeben werden soll:

    -----> "BGN" = Anfang des Programms

    "END" = Ende des Programms

    "PRÜF" = Prüfung der Datein benötigt.

    "DATEN" = Prüfung der Daten beginnt.
    = Daten werden dazu eingelesen.

    Wie ihr seht gehören die Daten die jeweils in einem Datensatz stehen zusammen und ich möchte die Zeichen die in "..." stehen mit denen nach den /// bei der Ausgabe auf der Konsole verknüpfen.

    Ich wäre euch weiterhin für jeden weiteren Tipp sehr dankbar :)!

    Vielen Dank im Voraus!



  • Gib mal ein Minimalbeispiel wie so eine einzulesende Datei aussieht.
    Die defines verwirren mich irgendwie in diesem Zusammenhang.



  • Okay, dass hab ich jetzt so weit alleine hinbekommen :).

    Jedoch habe ich jetzt ein anderen Anliegen ^^. Kann man sich mit

    while (std::getline(file.ignore( numeric_limits< streamsize >::max(), '#'), str))
       std::cout << str << '\n';
    

    auch nur einen Teilbereich der restlichen Zeile ausgeben lassen?

    Da wenn ich mir jetzt das Zeilenende ausgeben lasse, immer noch ein " am Ende steht und ich das nicht in der Ausgabe stehen haben möchte.

    Ich würde mich weiterhin über Tipps von euch sehr freuen :)!



  • Hat jemand dazu eine Idee?


Anmelden zum Antworten