Datei lesen bestimmte Zeilen nach Zeichen trennen und speichern



  • Hallo,

    ich würde gerne wissen wie man folgendes programmiert:
    Aus einer Datei lese ich folgenden Text: Die ersten 2 Zeilen sollen ignoriert werden. Ich möchte ab der 3.Zeile , die Daten zwischen den Zeichen '|' abspeichern als Variable. Wobei auch die wo nichts zwischen den Trennzeichen
    Mein Versuch es zu programmieren zeige ich erst gar nicht, da ich gerne wissen möchte wie man es wirklich macht und meiner nicht fertig ist!
    Vielen Dank für Antworten!

    test||
    test2||
    KEINNAME|KeinKommentar||1|||210101|210201|||10|0|0||30|15|10|||100||||||||||||||



  • std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '|');
    std::string result;
    std::getline(std::cin, result, '|');
    std::cout << "gefunden: " << result << '\n';
    


  • Es gibt leider nicht "den Weg" wie man das in C++ macht. Aber liest mal hier, da sind ein paar gute Antworten dabei:
    http://stackoverflow.com/questions/236129/splitting-a-string-in-c



  • Matthi70 schrieb:

    Aus einer Datei lese ich folgenden Text: Die ersten 2 Zeilen sollen ignoriert werden. Ich möchte ab der 3.Zeile , die Daten zwischen den Zeichen '|' abspeichern als Variable. Wobei auch die wo nichts zwischen den Trennzeichen
    Mein Versuch es zu programmieren zeige ich erst gar nicht, da ich gerne wissen möchte wie man es wirklich macht und meiner nicht fertig ist!

    Ein wenig mehr von Deiner Anstrengung hätten wir ja schon gerne gesehen.

    Anyway...
    Hier mal meine Version:

    #include <array>
    #include <iomanip>
    #include <iostream>
    #include <limits>
    #include <string>
    #include <vector>
    
    typedef std::array<std::string, 33> string_tuple;
    
    std::ostream& operator<<(std::ostream& os, const string_tuple& st){
      string_tuple::size_type i=0;
      for(; i<st.size()-1; ++i)
        os << '\"' << st[i] << "\", ";
      os << '\"' << st[i] << '\"';
      return os;
    }
    
    std::istream& operator>>(std::istream& is, string_tuple& st){
      for(string_tuple::size_type i=0; i<st.size(); ++i)
        if(!std::getline(is>>std::ws, st[i], '|'))
          break;
      return is;
    }
    
    int main(){
      using namespace std;
      cin.ignore(numeric_limits<streamsize>::max(), '\n');
      cin.ignore(numeric_limits<streamsize>::max(), '\n');
      vector<string_tuple> vec;
      for(string_tuple st; cin >> st;){
        vec.push_back(st);
      }
      for(auto st: vec)
        cout << st << '\n';
    }
    

    Für mich stellt die Überladung von operator>>() und operator<<() den Königsweg dar.


Log in to reply