Problem mit Vektor



  • Hallo!
    Fragen sind im Code angefügt

    #include <fstream>
    #include <iostream>
    #include <vector>

    using namespace std;
    int main()
    {
    ifstream in ("h:\\test2.txt");
    vector<vector<char>> vec2(200);

    char str[2000];

    while(in)
    {
    in.getline(str,255);
    str.push_back();
    //Ich will die Zeile Wort für Wort einfügen in den 2D Vektor
    // Wie geht das? Welches Argument braucht push_back?
    // Wie kann ich diesen Vector dann durchsuchen auf Zielwörter?
    }

    }



  • Bitte benutze Code - Tags! Das kann kein Schwein lesen.



  • #include <fstream> 
    #include <iostream> 
    #include <vector> 
    
    using namespace std; 
    int main() 
    { 
    ifstream in ("h:\\test2.txt"); 
    vector<vector<char>> vec2(200); 
    
    char str[2000]; 
    
    while(in) 
    { 
    in.getline(str,255); 
    str.push_back(); 
    //Ich will die Zeile Wort für Wort einfügen in den 2D Vektor 
    // Wie geht das? Welches Argument braucht push_back? 
    // Wie kann ich diesen Vector dann durchsuchen auf Zielwörter? 
    } 
    
    }
    


    1. wenn du dein buffer-array schon 2000 Zeichen lang machst kannst du auch 1999 Zeichen mit getline() lesen lassen

    2)str.push_back() wird nicht klappen, weil das Array keine push_back_methode hat.

    3)benutz am besten strings und dann statt des 2D-vectors mit char einen vector<string>



  • So könnte man es z.B. machen:

    #include <fstream>
    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char **argv) {
      ifstream ifs("tmp.txt");
      if (!ifs)
        return 1;
    
      vector<string> vec;
      string str;
    
      //Einlesen
      while (!ifs.eof()) {
        getline(ifs, str, ' ');
        vec.push_back(str);
      }
    
      //Ausgeben
      vector<string>::iterator it = vec.begin();
      for ( ; it != vec.end(); ++it)
        cout<<*it<<'\n';  
    
      return 0;
    };
    

    Wie du den Vektor durchsuchst, das findest jetzt aber selber raus: www.cppreference.com



  • Oder so: 🙂

    #include <iostream>
    #include <iterator>
    #include <algorithm>
    #include <fstream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char **argv) {
      ifstream ifs("tmp.txt");
      if (!ifs)
        return 1;
      vector<string> vec;
      copy( istream_iterator<string>(ifs), 
            istream_iterator<string>(),
            back_inserter<vector<string> >(vec));
      copy( vec.begin(), vec.end(), ostream_iterator<string>(cout,"\n"));
      return 0;
    }
    


  • Ein Hoch auf die STL, hehe :p



  • #include <fstream> 
    #include <iostream> 
    #include <vector> 
    #include <string> 
    
    using namespace std; 
    
    int main(int argc, char **argv) { 
      ifstream ifs("H:\\test4.txt"); 
      if (!ifs) 
        return 1; 
    
      vector<string> vec; 
      string str; 
    
      //Einlesen 
      while (!ifs.eof()) { 
        getline(ifs, str, ' '); 
        vec.push_back(str); 
      } 
    
      //Ausgeben 
      vector<string>::iterator it = vec.begin(); 
      for ( ; it != vec.end(); ++it) 
        {
    	//cout<<*it<<'\n';   
    }
    
      cout <<"DAS IST DER VEKTOR"<<" "<< vec[4]<<endl;
    
      int i;
      cin >> i;
    };
    

    Ich will jetzt die 3.Zeile ausgeben aus dem eingelesenen textfile.
    Wie kann ich dem Vektor klarmachen, dass er zeilenweise einliest.
    Besser gesagt, wie kann ich die einzelnen Zeilen ansprechen und ausgeben lassen?

    Danke,

    Johannes



  • Wenn du willst das er Zeilenweise einliest musst du folgende Zeile:

    getline(ifs, str, ' ');
    

    in

    getline(ifs, str);
    

    ändern.

    Dann wird Zeilenweise eingelesen.

    mit

    std::cout << vec[2] << std::endl;
    

    gibt er dann die 3 Zeile aus.



  • DANKE!
    😉



  • Danke soweit funktionierts.

    Wie gebe ich nun das erste oder zweite Wort einer bestimmten Zeile aus?

    lg
    johannes



  • int pos1=vec[i].find(' '),pos2=vec[i].find(' ',pos1+1);//findet die ersten beiden Leerzeichen im String
    cout<<"1. Wort:"<<vec[i].substr(0,pos1-1)<<endl;
    cout<<"2. Wort:"<<vec[i].substr(pos1-1,pos2-pos1-1)<<endl;
    

    (oder du jagst den String durch einen Stringstream und liest ihn dort wortweise aus)



  • mein Problem ist, dass ich das textfile nach bestimmten schlüsselwörten filtern möchte.

    diese stehen dann an erster oder auch an 3 stelle des files.

    die zeilen in welchen die schlüsselwörter vorkommen an der stelle 1 oder 3 sollen dann in ein neues textfile gespeichert werden.

    wäre für das das string stream besser vom handling her?

    danke.
    johannes



  • Nein, dafür bietet string die Memberfunktion find() mit zig Überladungen (Einzelbuchstaben, char*, andere Strings; Suche nur in Teilen,...) und Abwandlungen (find_first_of, find_last_not_of, rfind,...) an.



  • ok.
    danke für den hinweis.
    mal schauen.

    johannes


Anmelden zum Antworten