2011-05-28 6 views
0

A l'intérieur du fichier texteC++ ce qui serait un bon moyen de lire à partir du fichier texte?

- début du fichier texte ----

 
Physics 

0 

Chemistry 

1 

English 

2 

---- la fin du fichier texte

 
class Book 
{ 
private: 
    string title; 
    int category; 
}; 

1) Je veux stocker physique, chimiste, anglais au titre; et 0,1,2 à une catégorie;

ex, physique est la catégorie 0 chemisty est catégorie 1 English est la catégorie 2

ce que j'ai ...

 
    string title; 
    string number; 

if(book_input.is_open()) 
    while(!book_input.eof()) 
{ 
    getline(book_input, title, '\n'); 
    getline(book_input, number, '\n'); 

    Book list(title, number); 
} 

Est-ce une bonne façon de le stocker ??

Répondre

4

qui ressemble à un début raisonnable, mais votre code de lecture doit être:

while(getline(book_input, title, '\n') && getline(book_input, number, '\n')) { 
    Book abook(title, number); 
    // do something with abook 
} 

Ne pas effectuer le test eof, voir this link pour des raisons.

Vous devrez faire quelque chose avec chaque livre tel qu'il est lu, et le constructeur de livres devra convertir son deuxième paramètre d'une chaîne à un int.

+0

Peut-être (un lien vers) une explication pourquoi ne pas tester contre EOF. – Xeo

+0

@Xeo Je suis fatigué de dire aux gens que - ajouter un lien vous-même, par tous les moyens. –

1

C++ peut utiliser value << stream pour entrer d'autres types que des chaînes. Un int par exemple.

Vous pouvez utiliser une méthode similaire (mais à l'envers de) cet exemple:

http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.2

Est-ce une bonne façon de le stocker ??

Votre définition de classe est correcte. Vous aurez également besoin de définir un constructeur, si:

class Book 
{ 
public: 
    Book(string title, int category) 
     : title(title), 
     category(category) 
    { 
    } 

// Todo: Maybe also some getters for title/category here... 

private: 
    string title; 
    int category; 
}; 

Si vous voulez, vous pouvez aussi utiliser un enum pour la catégorie, bien que cela ne fonctionne que si vous avez un nombre limité de catégories connues. Si vous souhaitez potentiellement développer votre ensemble de catégories à l'avenir, ou si vous êtes incertain, continuez à utiliser un int. Bien que si vous le faites, je vous recommande de l'appeler categoryId à la place.

0

Je pense qu'il est préférable que le constructeur prenne un nombre entier pour category, par exemple en utilisant stringstream pour convertir en nombre entier.

Et en supposant chaque titre a toujours numéro de catégorie, vous pouvez contourner vérifier le nombre comme ci-dessous:

while(getline(book_input,title)){ 
    getline(book_input,strNumber); 
    stringstream ss(strNumber); 
    int number; 
    ss>>number; 
    Book aBook(title,number); 
    // code to process aBook 
} 
Questions connexes