Strings aus Datei herauslesen und in zweidimensionalem Array speichern



  • Ach herrje, stimmt ja, die Vektoren gibts ja auch noch. Wie siehts da mit prophilaktischem Speicheralloziieren aus? Muss ich das machen, oder wird das beispielsweise bei pushback automatisch erledigt?

    und wie schmeiße ich ein solches vector<vector<string>>-Array nach Gebrauch am besten weg?

    Viele Grüße,
    TheBrain



  • Du kannst den Speicher mit reserve() reservieren, aber das bringt nur Geschwindigkeitsvorteile - push_pack() holt sich schon genug Platz.

    (und "wegschmeißen" können sich vector<>en auch alleine, wenn sie nicht mehr gebraucht werden ;))



  • Ok, danke.

    Sagen wir mal vector<vector<string> > vec_str;
    Das Problem mit den Strings ist nun, dass ich fscanf nicht mehr verwenden kann, um die Datei auszulesen (da diese char* verlangt).
    Angenommen eine Zeile enthält 5 Strings, wie kann ich nun diese 5 Strings in ein Element von vec_str hauen?

    Also dass vec_str[0] den Vector vec enthält, wobei vec[0] = String 1, vec[1] = String 2 usw.



  • Strings liest du am besten mit getline ein. Und ich nehme jetzt mal an, dass die Datei folgendes Format hat:

    String0 String1 String2 String3
    String4 String5 String6 String7
    ...

    ifstream ifs("file.txt");
    if (!ifs)
      return 1;
    
    string tmp("");
    while (ifs.good()) {
      getline(ifs, tmp);  //Zeilenweise einlesen
      //Hier kannst du tmp dann splitten und gleich in vec_str reinhauen
    };
    
    ifs.close();  //Edit: Close vergessen
    


  • Mit getline versuche ich es gerade, aber er schmeißt mir beim Kompilieren eine elendlange Fehlermeldung raus, mein Code sieht momentan so aus:

    #include <string>
    #include <vector>
    #include <fstream>
    #include <stdlib.h>
    #include <stdio.h>
    
    using namespace std;
    
    typedef vector<vector<string> > ret_array;
    
    ret_array ReadFromFile(int data_type, int option, string keyword)
    {
        if(data_type == 0)
        {
            ret_array result;
            result.clear();
    
            string curr_line("");
    
            ifstream words;
            words.open("file.dat",ios::in);
    
            if(words.fail() || words.bad() || keyword == "")
            {
                result[0][0] = "error";
                return result;
            }
            else
            {
                string str1(""), str2(""), str3(""), str4(""), str5("");
                int row = 0;
                while (!words.eof() && words.good())
                {
                    getline(words, curr_line);
                    if(str1 == keyword)
                    {
                        result[row].push_back(str1);
                        result[row].push_back(str2);
                        result[row].push_back(str3);
                        result[row].push_back(str4);
                        result[row].push_back(str5);
                    }
                    row++;
                }
                words.close();
                return result;
            }
        }
    }
    
    int main()
    {
        ret_array s = ReadFromFile(0,0,"Hallo");
        return 0;
    }
    

    Sieht jemand da nen groben Schnitzer? 🙄



  • Sieht jemand die Fehlermeldung und Zeile?



  • Ich würde sie ja gerne hier reinkopieren, aber da kommt so viel, dass das meiste schon wieder "oben aus der Konsole rauswandert". Aber gut, hier ein paar Auszüge 😉

    //Edit:
    Wieder gelöscht ...



  • Hmm, ok, lag dann wohl an mir *schäm*
    Mit g++ lässt es sich kompilieren.

    Tut mir leid, Leute!



  • Nur ein kleiner Tip: vector::operator[] prüft nicht, ob du noch genug Platz hast - für den inneren Vector nutzt du zwar push_pack() (das ist auch OK), aber beim äußeren Vector speicherst du in Bereiche, die dir nicht gehören).

    while (!words.eof() && words.good())//btw, hier reicht words.good() aus ;)
    {
      getline(words, curr_line);
      vector<string> line_vec;
      //hier fehlt noch etwas, um curr_line auf str1..str5 zu verteilen
      //noch besser: initialisiere "vector<string>line_vec(5);" und pack' die Teilstringe direkt darein
      if(str1 == keyword)
      {
        line_vec.push_back(str1);
        line_vec.push_back(str2);
        line_vec.push_back(str3);
        line_vec.push_back(str4);
        line_vec.push_back(str5);
        result.push_back(line_vec);
      }
    }
    


  • Hast recht, werde das ändern!
    Und das Aufdröseln der Zeile mach ich mit Hilfe von istringstream, klappt super 🙂


Anmelden zum Antworten