2012-04-05 10 views
0

Ich versuche, einige Daten von diesen Vektoren auf Textdateien zu schreiben. Wenn ich den Code ausführe, wird ein Laufzeitfehler zurückgegeben. Category, Product, Cart, Customer und Address sind alle struct mit Mitgliedern, die jeweils get_member zurückgibt.Vector Iterator nicht dereferencable (Vektor innerhalb Vektor)

ofstream write_cats; 
    write_cats.open("catprd.dat", ios::out, ios::trunc); 
    vector<Category>::iterator i; 
    write_cats << cats.size() << endl; 
    for (i = cats.begin(); i < cats.end(); i++) { 
     write_cats << i -> get_catid() << '\t'; 
     } 
    vector<Product>::iterator j; 
    write_cats << prods.size() << endl; 
    for (j = prods.begin(); j < prods.end(); j++) { 
     write_cats << j -> get_prodid() << '\t'; 
     write_cats << j -> get_prodprice() << endl; 
     } 
    write_cats.close(); 

    ofstream write_carts; 
    write_carts.open("carts.dat", ios::out, ios::trunc); 
    vector<Cart>::iterator k; 
    write_carts << carts.size() << endl; 
    for (k = carts.begin(); k < carts.end(); k++) { 
     write_carts << k -> get_cartid() << '\t'; 
     write_carts << k -> get_day() << endl; 
     } 
    vector<Cart_item>::iterator l; 
    write_carts << cart_items.size() << endl; 
    for (l = cart_items.begin(); l < cart_items.end(); l++) { 
     write_carts << l -> get_cartitemid() << '\t'; 
     write_carts << l -> get_qty() << endl; 
     } 
    write_carts.close(); 

    ofstream write_custs; 
    write_custs.open("custs.dat", ios::out, ios::trunc); 
    vector<Customer>::iterator m; 
    vector<Address>::iterator n; 
    write_custs << custs.size() << endl; 
    for (m = custs.begin(); m < custs.end(); m++) { 
     write_custs << m -> get_cust_id() << '\t'; 
     write_custs << n -> get_zip_code() << endl; 
     } 
    write_custs.close(); 

Returns Laufzeitfehler "Vector Iterator dereferencable nicht" Hier

ist, wie struct Address wie folgt aussieht:

using namespace std; 
#pragma once 
#include <string> 

struct Address { 

public: 

int get_st_number() const{return st_number;} 
int get_zip_code() const{return zip_code;} 
string get_st_name() const{return st_name;} 



Address(){}         
Address (int num, string name, int zip) 
    : st_number(num), st_name(name), zip_code(zip) {} 

private: 
int st_number; 
int zip_code; 
string st_name; 


}; 

und struct Customer:

struct Customer { 
public: 

Address get_address() const{return addr;} 
int get_cust_id() const{return cust_id;} customer id 
string get_name() const{return cust_name;} 
Customer (int id, string n, Address a) 
    : cust_id(id), cust_name(n), addr(a) {} 


string display_addr() const { 
    std::cout<<setw(15)<<cust_name<<" "; 
    std::cout<<setw(15)<<cust_id<<" "; 

    return string(); 
} 



private: 

int cust_id; 
string cust_name; 
Address addr;   
}; 
+2

Willkommen bei StackOverflow. Ihr Codefragment ist zu lang und zu kurz. Es ist zu lang und mit zu viel überflüssiger Schmiere gefüllt, damit die Leute es verstehen können. Es ist auch zu kurz; Es fehlen die Schlüsselstücke, die zum Kompilieren benötigt werden. Bitte erstellen Sie ein ** kurzes **, ** vollständiges ** Programm, das Ihr Problem veranschaulicht. Weitere Informationen finden Sie unter http://sscce.org. –

Antwort

3

Sie vector<Address>::iterator n; zu initialisieren vergessen

+0

Es ist richtig unter Vektor :: Iterator m; Es sei denn, Sie meinen innerhalb der for-Schleife für Iterator m? Wie würde der Code aussehen? – ignacio

+0

@ user1314967: Sie deklarieren es, aber geben Sie niemals einen gültigen (dereferenzierbaren) Wert, wie Sie es mit 'm' mit' m = cus.begin() 'tun. –

+0

@MikeSeymour Wenn ich "m" für "struct Customer" und "struct Address" verwende, dann sagt es mir, dass die Mitglieder von "Address" nicht Teil von "Customer" sind. Ich versuche, über "Address get_address() const {return addr;}" zu "Address" in "Customer" zu gelangen, aber ich kann kein Member in "Address" aufrufen, zum Beispiel "st_number", was ein 'int' in ist 'Address' mit einer Funktion von' int get_stnum() {return st_number; } ' – ignacio

1

Sie deklarieren einen Iterator n, initialisieren ihn jedoch nicht auf einen dereferenzierbaren Wert. Von Ihrem Update sieht es so aus, als ob Sie die mit dem Kunden verbundene Address drucken möchten. so würden Sie über den Kunden Zugriff bezeichnet durch m, anstatt eine separate Iterator:

write_custs << m -> get_cust_id() << '\t'; 
write_custs << m -> get_address().get_zip_code() << endl; 

Auch könnte es eine gute Idee sein Umfang jeder Iterator innerhalb seiner Schleife; das ist weniger fehleranfällig als eine neue in den äußeren Umfang jedes Mal erklärt:

for (vector<Whatever>::const_iterator i = stuff.begin(); i != stuff.end(); ++i) { 
    // do stuff with "i" 
} 
// "i" is no longer available - no danger of accidentally using it again. 

Und ein paar andere Punkte:

  • Sie sollten != verwenden, anstatt < mit dem end() Iterator vergleichen ; < funktioniert nicht für einige Arten von Iteratoren;
  • Sie sollten eine neue Zeile in die Datei schreiben als '\n' statt endl; endl löscht den Dateipuffer und zwingt die Datei an diesem Punkt auf die Festplatte zu schreiben, was extrem langsam sein kann.
+0

Super, ich werde diese Änderungen vornehmen. Ich lerne seit ein paar Monaten C++. – ignacio

Verwandte Themen