Probleme mit vector



  • Ich habe einen vector vom typ char* der mit zeilen aus einer Datei gefüll werden soll. Dazu verwende ich folgenden Code:

    while (inFile.getline (tmp, 255)) {
        lines.push_back (tmp);
      }
    

    wenn ich jetzt innerhalb dieser Schleife mir den Inhalt anzeigen lasse:

    cout << "> " << lines.at(0)  << endl;
    

    klappt alles wunderbar. solbald ich mir den Inhalt mit dem selben Code nach der Schleife anzeigen lassen will bekomme ich immer leere Ergebnisse. Woran liegt das?

    In Projekt für die Schule, also relativ wichtig . Danke!



  • Zeig mal ein bisschen mehr code. Speziell die variable tmp ...



  • So wie ich das erkennen kann hast du einen vector voller Zeiger auf ein char.
    Das Problem hierbei ist das du in tmp schreibst dann an den vector die adresse von tmp gibst, dann überschreibst du den inhalt von tmp mit der nächsten Zeile und übergibst wieder die Adresse an den Vector.
    Du legst also nie neuen Speicherplatz an sondern du hast immer nur die selbe Adresse im Vector stehen, nämlich die von tmp.
    Um dieses Problem zu lösen musst du mit new neuen speicher allozieren und erst dann diesen an den Vector übergeben.
    Ausserdem würde ich strings verwenden.

    P.S.: Nicht vergessen den Speicher wieder mit delete zu löschen!



  • hier ist der komplette quelltext. is noch net ganz fertig, das programm. ich hab nur keine strings verwendet, weil das mit getline zu umständlich ist (also zumindest meiner erfahrun nach 🙂

    #include <iostream>
    #include <stdlib.h>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <time.h>
    
    using namespace std;
    
    int RandomCreateWithRange (int min, int max);
    
    int main(int argc, char *argv[]) {
      ifstream inFile ("user.dat");
      vector<char*> lines;
      string recLine;
      char tmp[255];
      int r, n, c, xt;
    
      cout << "Random Sampling C++-App - (c) 2004 by Sean Mertiens\n\n";
      cout << "Initializing random-number-generator... \n";
      srand (time (NULL));
      cout << "Loading file user.dat in root-dir... ";
    
      if (! inFile.good()) {
        cout << "failed!\n";
        exit (1);
      } else {
        cout << "done.\n";
      }
    
      cout << "Filling vector... ";
    
      while (inFile.getline (tmp, 255)) {
        lines.push_back (tmp);
      }
    
        cout << lines.at (0) << endl;
      inFile.close ();
    
      cout << lines.size () << " items... done.\n";
      cout << "Calculating in range 0-" << lines.size () << endl << endl;
      cout << "Please specify the number of samples to be found: ";
      cin >> n;
      cout << "\n\n==== Result: ====\n";
    
      c=1;
      while (c <= n) {
        r = 0 + (rand() % (lines.size () - 0 + 1));
        cout << "> " << lines.at (r) << endl;
        c++;
      }
    
      cout << "Exit program? [y/n] ";
      cin >> xt;
    
    }
    


  • Versuch es mal so:

    // ...
    
    char *tmp;
    
    // ...
    
    while(!inFile.eof())
    {
        tmp = new char[255];
        inFile.getline(tmp, 255);
        lines.push_back(tmp);
    }
    
    // ...
    // Nicht vergessen am Ende den Speicher auch wieder freizugeben!!!
    
    for(int i = 0; i < lines.size(); i++)
    {
        delete[] lines[i];
    }
    lines.clear();
    
    // ...
    

    Ich denke so müsste es funktionieren.
    Mit strings wird das ganze garantiert nicht komplizierter, du brauchst halt nur einen char[] buffer für getline, welcher sich ja aber ohne Probleme in einen String casten lässt.



  • btw: man verwendet .at() eigentlich nicht. operator[] ist wesentlich besser, da er keine sinnlosen range checks macht.



  • Funktioniert, danke!!!



  • getline mit strings umständlich?

    vector<string> vec;
    
    string str;
    while (getline(cin, str))
      vec.push_back(str);
    

    Mehr nicht. Kein new[], kein delete[], keine Probleme 🙂
    Außerdem: <ctime> und <cstdlib> statt der alten .h-Versionen.


Anmelden zum Antworten