2016-11-08 7 views
-3

Um die obige Frage zu spezifizieren, nehme ich eine Klasse, um C++ zu lernen. Wir haben gerade erst von dynamischen Arrays und Klassen erfahren. In einer kürzlichen Aufgabe sollten wir Informationen aus einer Textdatei nehmen und bestimmte Zellen des dynamischen Arrays innerhalb eines Konstruktors mit der gegebenen Struktur und Klasse initialisieren (wie unten gezeigt). Davon abgesehen ist mein Problem, dass jedes Mal, wenn ich versuche, das Programm zu starten, abstürzt.Wie lese ich Informationen aus einer Textdatei in ein dynamisches Array innerhalb eines Konstruktors?

class call_record 
{ 
public: 
    string firstname; 
    string lastname; 
    string cell_number; 
    int relays; 
    int call_length; 
    double net_cost; 
    double tax_rate; 
    double call_tax; 
    double total_cost; 
}; 

class call_class 
{ 
public: 
    call_class(); 
    ~call_class(); 
    bool Is_empty(); 
    bool Is_full(); 
    int Search(const string key); 
    void Add(); 
    void Remove(const string key); 
    void Double_size(); 
    void Process(); 
    void Print(); 
private: 
    int count; 
    int size; 
    call_record *call_DB; 
}; 

// default constructor 
call_class::call_class() 
{ 

    size = 5; 
    count = 0; 
    ifstream in; 
    in.open("callstats_data.txt"); 

    while (!in.eof()) 
    { 

     if(Is_full()) 
     { 
      Double_size(); 
     } 

     in >> call_DB[count].firstname 
      >> call_DB[count].lastname 
      >> call_DB[count].cell_number 
      >> call_DB[count].relays 
      >> call_DB[count].call_length; 

     count++; 
    } 

    in.close(); 

} 

Um mehr Kontext gehört, fand ich heraus, dass diese Probleme in erster Linie entsteht, wenn ich versuche, eine Datei in ein dynamisches Array zu lesen, die in dem Konstruktor einer Klasse ist. Ich habe versucht, ein statisches Array anstelle eines dynamischen Arrays zu verwenden, und es funktionierte überhaupt nicht. Ich kann jedoch ein statisches Array nicht wirklich verwenden. Ich habe mich also gefragt, ob es eine bestimmte Möglichkeit gibt, Informationen aus einer Textdatei in ein dynamisches Array innerhalb eines Standardkonstruktors zu platzieren.

+0

Zu allererst: Änderung 'call_record * call_DB;' auf 'std :: vector call_DB;' eine _dynamic array_ zu haben. –

+0

Sie haben Ihre Methoden 'Is_full' oder' Double_size' nicht angezeigt, und das Problem liegt wahrscheinlich irgendwo in einer dieser Methoden. 'while (! in.eof())' verursacht wahrscheinlich auch Probleme, die sich jedoch eher als schlechte Daten manifestieren als Abstürze. –

+0

Zweitens: Mind [Warum wird Iostream :: eof in einem Loop-Zustand als falsch angesehen?] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-sidered-wrong) . –

Antwort

0

Das Problem ist, dass kein Speicher für call_DB[count] reserviert ist;

Ordnen Sie es dynamisch oder statisch zu, bevor Sie call_DB[count] verwenden;

Zum Beispiel:

call_record call_DB[5];

statt call_record *call_DB;

Auch wenn call_DB eine bestimmte Größe hat über sie nicht gehen, stellen Sie sicher, dass Sie nicht versuchen, oben zugewiesenen Speicher zugreifen:

while (!in.eof() && (count < 5))

Wenn Sie deklariere call_DB mit STL ein std :: vector, dann wirst du den obigen Schutz vermeiden und dein Vektor wird wie benötigt wachsen.

std::vector<call_record> call_DB;

Denken Sie daran, erforderlich verwenden Include-Datei:

#include <vector>

Verwandte Themen