2016-04-28 7 views
-4

Ich habe abstrakte Klasse (Service) mit zwei abgeleiteten Klassen (Court und Machine). Ich habe auch ein Zeiger-Array des Dienstes, und ich versuche, von einer Textdatei zu lesen, die Informationen für Gericht und Maschine enthält. Um festzustellen, welche Informationen für welche Klasse sind, verwende ich eine if.Wie liest man eine Textdatei in ein Zeigerfeld?

Mein Code kompiliert, aber bei der Ausführung erhalte ich einen Segmentierungsfehler. Ich weiß, das bedeutet, dass ich auf Speicher zugreife, was ich nicht tun sollte, aber ich bin mir nicht sicher, was ich falsch mache.

Ich habe nie mit Zeigerarrays gearbeitet. Mache ich etwas falsch, wenn ich Objekte eingeben möchte? Ich habe sichergestellt, dass beide Klassen am Anfang des Programms enthalten sind.

Service *listServices[20]; 
ifstream ArchService; 
ArchService.open("Services.txt"); 

while(!ArchService.eof()) 
{ 
    for (int iA = 0; iA < 20; iA++) 
    { 

     string clave, descripcion, deporte; 
     int tiempomax, maxpersonas; 
     char tipo; 
     double costo; 
     bool instructor; 
     ArchService >> clave >> tiempomax >> tipo >> costo; 

     if (tipo == 'C' || tipo == 'E' || tipo == 'B') 
     { 
      ArchService >> instructor; 
      ArchService.ignore(); 
      getline(ArchService, descripcion); 
      listServices[iA] = new Machine(clave, tiempomax, tipo, costo, instructor, descripcion); 
     } 

     else 
     { 
      ArchService >> maxpersonas; 
      ArchService.ignore(); 
      getline(ArchService, deporte); 
      listServices[iA] = new Court(clave, tiempomax, tipo, costo, maxpersonas, deporte); 
     } 
     listServices[iA]->print(); 
    } 
    ArchService.close(); 
} 
+0

Wissen Sie, wo der Segmentierungsfehler auftritt? – NathanOliver

+0

Es ist keine gute Idee, 'eof()' als Loop-Bedingung zu verwenden. –

+0

@Lorraine [Verwenden Sie nicht 'while (! ArchService.eof())'] (http://Stackoverflow.com/q/5605125/418066) – Biffen

Antwort

0

Jedes Element listServices zugeordnet immer und immer wieder, mit alten Werten nicht delete d sein, so bleiben sie nur baumelnden Referenzen und mehrere Speicherlecks bilden. Wahrscheinlich ist das die Ursache. Wie bereits erwähnt, entfernen Sie lieber die while(!ArchService.eof())-Schleife, wenn Sie nur das Array von 20 List-Services füllen möchten.

Verwandte Themen