2009-11-09 4 views
1

Je reçois une erreur système lorsque j'essaie de compiler le code ci-dessous sur Visual C++ 2008 Express. Ce que j'essaie de faire est d'initialiser le tableau d'objets avec des données lues à partir du fichier. Je pense qu'il y a quelque chose qui ne va pas dans la boucle while, car lorsque j'initialise ces objets manuellement sans la boucle while, cela semble fonctionner. Voici le fichier de code et texte:Initialisation du tableau d'objets avec les données du fichier texte

#include <iostream> 
#include <string> 
#include "Book.h" 

using namespace std;    

int main() 
{ 
    const int arraySize = 3; 
    int indexOfArray = 0; 

    Book bookList[arraySize]; 
    double tempPrice;//temporary stores price 
    string tempStr;//temporary stores author, title 


    fstream fileIn("books.txt"); 

    while (!fileIn.eof()) 
    { 
     getline(fileIn,tempStr); 
     bookList[indexOfArray].setAuthor(tempStr); 

     getline(fileIn,tempStr); 
     bookList[indexOfArray].setTitle(tempStr); 

     fileIn >> tempPrice; 
     bookList[indexOfArray].setPrice(tempPrice); 

     if (indexOfArray < arraySize) //shifting array index while not exceeding array size 
      indexOfArray++; 
    } 

    fileIn.close(); 

    return 0; 
} 

et le fichier texte:

Author1 
Book1 
23.99 
Author2 
Book2 
10.99 
Autho3 
Book3 
14.56 
+1

Quel est le contenu exact de "l'erreur système"? – tgeros

Répondre

5

Il semble que vous essayez d'écrire dans bookList [3] dans la boucle. Vous parcourrez trois fois le tableau en incrémentant indexOfArray à chaque fois. Cela laissera indexOfArray à 3 - votre condition telle qu'elle est écrite permettra à indexOfAray d'être incrémenté à 3. Ensuite, si vous avez un retour à la ligne après le "14.56" dans votre fichier de données, vous bouclez encore une fois et essayez de passer un vide string à bookList [indexOfArray] .setAuthor() menant à un segfault puisque indexOfArray est passé la fin du tableau.

Je suggérerais d'abandonner le tableau codé en dur et d'utiliser un vecteur std :: à la place. Au début de chaque boucle, utilisez simplement push_back() pour ajouter un nouveau livre à la fin du vecteur, puis utilisez back() pour accéder au nouvel élément du tableau.

+0

bonne prise. +1 –

+0

J'ai réarrangé la boucle while et utilisé fileIn.ignore() pour rejeter la fin de la ligne après avoir lu double. Nous n'avons pas encore appris de vecteurs, alors j'essaie de m'en tenir au matériel abordé dans les conférences. À l'avenir, je vais certainement essayer d'utiliser le vecteur comme vous l'avez suggéré. – Mike55

0

La clé doit être dans le contenu de

#include "Book.h" 

Je copie-collé votre code, et remplacé le #include avec mon hypothèse de ce que la classe Book pourrait ressembler:

class Book 
{ 
    std::string auth; 
    std::string title; 
    double price; 
public: 
    void setAuthor(std::string& str) 
    { 
     auth = str; 
    } 

    void setTitle(std::string& t) 
    { 
     title = t; 
    } 

    void setPrice(double d) 
    { 
     d = price; 
    } 
}; 

et il compilé. Peut-être pourriez-vous partager votre Book.h, ou y chercher des problèmes? Commencez avec une définition simple de Book (comme ci-dessus) et commencez à lire le code jusqu'à ce que vous ayez trouvé les lignes qui causent le problème. C'est une méthode grossière de résoudre le problème, mais parfois c'est la manière la plus directe.

+0

Ceci est intéressant, car comme je l'ai mentionné, cela marche si j'initialise le tableau manuellement. – Mike55

2

Il y a une autre erreur d'exécution dans votre code: Vous ne lisez pas une ligne entière avec l'appel à fileIn >> tempPrice;. Le prochain appel à getline() sera lu à la fin de la ligne, de sorte que vous obtiendrez une chaîne vide lorsque vous attendez un auteur.

Vous êtes alors déconnecté d'une ligne dans votre fichier texte, et vous essayez de convertir un titre en double. Cela fait que le signal fstream est une erreur, et après cela, vous avez des problèmes.

Brett a raison, un vecteur avec push_back est une meilleure solution ici. Brett a également fait remarquer à juste titre que vous pourriez rencontrer des erreurs si votre fichier avait des lignes supplémentaires. Vous pouvez corriger cela en vérifiant si vous avez lu avec succès à partir du fichier:

if(fileIn >> tempPrice) 
{ 
    bookList[indexOfArray].setPrice(tempPrice); 
} 
else 
{ 
    break; 
} 

if(!getline(fileIn,tempStr)) 
{ 
    break; 
}