Fin de fichier

Résolu
poiuytrez3 Messages postés 150 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 17 mars 2009 - 29 nov. 2007 à 00:59
poiuytrez3 Messages postés 150 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 17 mars 2009 - 30 nov. 2007 à 00:49
Bonjour,
Je suis en train de faire un programme qui lit des informations dans un fichier, mais je ne comprends pas, il me prend 2 fois le dernier élément.
Merci de votre aide
Voici le fichier:  
Milk
2.5
3.4
456
Butter
1.5
2.5
123

PS : Le fichier s'arrête juste derrière le 123.

Et voici le code

void ProductsManager::deserialize(char* fileName)
{
    ifstream fileStream;
    fileStream.open(fileName);
   
    // If the file has been correctly opened
    if(fileStream)
    {
        cout << "fichier opened" << endl;
        getchar();
        string name;
        string buyingPrice;
        string sellingPrice;
        string quantity;
       
        double dBuyingPrice, dSellingPrice;
        int iQuantity;
       
        // For each product
        while(!fileStream.eof())
        {
            getline(fileStream, name);
            getline(fileStream, buyingPrice);
            getline(fileStream, sellingPrice);
            getline(fileStream, quantity);
           
            stringstream(buyingPrice) >> dBuyingPrice;
            stringstream(sellingPrice) >> dSellingPrice;
            stringstream(quantity) >> iQuantity;
                       
            cout << "dBuyingPrice : " << dBuyingPrice << endl;
           
            Product temp(name, dBuyingPrice, dSellingPrice, iQuantity);
            this->push_front(temp);
           
            getchar();getchar();
           
           
        }
       
        fileStream.close();
       
    }
    else
    {
        // the file has not been opened correctly
        throw "The file has not been opened correctly";
    }
   
}

-----------------------------------------------------------------------------------
http://www.mesdevoirs.net -- Corrections de devoirs de mathématiques en ligne

8 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
30 nov. 2007 à 00:17
[auteur/NDUBIEN/585281.aspx ndubien]
bas si elle fonctionne puisqu'il arrive a ouvrir le fichier.

[auteur/POIUYTREZ3/171355.aspx poiuytrez3]Bas, tu peux considérer que si il y a une ligne vide, alors soit il y a une erreur dans le fichier soit on atteint la fin. Dans les deux cas, on s'arrete:

        while(!fileStream.eof())
        {
            getline(fileStream, name);
            getline(fileStream, buyingPrice);
            getline(fileStream, sellingPrice);
            getline(fileStream, quantity);

            if (name.empty() || buyingPrice.empty() ||... etc)
            {
                      break;
            }
           
            stringstream(buyingPrice) >> dBuyingPrice;
            stringstream(sellingPrice) >> dSellingPrice;
            stringstream(quantity) >> iQuantity;

Ou un peu plus élégant :
while (!getline(fileStream, name).eof() && !getline(fileStream, buyingPrice) && !...)
{
    istringstream(buyingPrice) >> dBuyingPrice;
    ...
}

Ou encore: (à tester, normalement il n'y a pas de soucis)
while (getline(fileStream, name) && getline(fileStream, buyingPrice) && ...)
{
   istringstream(...
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
29 nov. 2007 à 08:26
T'as surement un caractère comme "passage à la  ligne" a la fin de ton fichier, si bien que toi, tu crois etre a la fin, et en fait, il existe encore quelques caractères. La facon d'éviter ca est de faire le test ligne par ligne et non par bloc de 4 lignes.
0
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
29 nov. 2007 à 13:08
Bonjour,

Voici une petite fonction qui je l'espè-re pourra t'aider:
void ouvrir(string &phrase) {
 cout <<"\n\nNom du fichier a analyser : ";
 string nom_fichier;
 getline(cin,nom_fichier);
 ifstream fichier(nom_fichier.c_str());
 if (!fichier) {
  cout <<"Erreur, fichier corrompu ou inexistant !\n\n";
  phrase = "Erreur, fichier corrompu ou inexistant !";
 } else {
  stringstream buffer;
  buffer << fichier.rdbuf();
  fichier.close();
  phrase = buffer.str();
 }
}
Seul prblème ne pas mettre le carractère ASCII n°26 (SUB) dans le contenu u fichier, sinon la fonction fini la lecture du fichier. Normallement elle devrait fonctionner ;)

A bientôt...


<hr />


Nico
0
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
29 nov. 2007 à 13:10
Cette fonction permet juste de lire un fichier, il ne vous reste plus qu'à l'adapter à votre problème ou a vous en servir telle-qu'elle.
A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
29 nov. 2007 à 16:17
Meme si le code de [auteur/POIUYTREZ3/171355.aspx poiuytrez3][auteur/POIUYTREZ3/171355.aspx ]n'est pas du tout optimisé et sera très lent pour de très gros fichier, le pb n'est pas au niveau de l'ouverture mais de la lecture. Elle est correcte, mais elle ne traite pas les cas critiques.

Juste une remarque, perso, j'utilise pas les stringstream, puisque dans ton cas, ce sont les istringstream qui répondent exactement au besoin. Enfin ca change pas grand chose.
istringstream(quantity) >> iQuantity;

Etant donné le coût de ces objets, tu devrais  essayer d'utiliser un seul object pour tes trois opérations.

Donc  [auteur/NDUBIEN/585281.aspx ndubien] je ne vois pas pk tu postes un truc qui n'a pas de rapport avec son pb :)
0
ndubien Messages postés 557 Date d'inscription dimanche 25 septembre 2005 Statut Membre Dernière intervention 10 mai 2014 4
29 nov. 2007 à 17:58
Et bien, si j'ai bien compris ilse demandait pourquoi son code ouvrait deux la dernière ligne du fichier...
N'est-ce pas?
Sa méthode d'ouverture ne fonctionnait donc pas:
   donc je lui en ai proposé une autre
Ceci n répond-il pas à sa question?
Certes pas pour le pourquoi mais celà lui donne une autre méthode pour ouvrir des fichiers...
Si je ne répond en aucun cas à sa question originale, qu'elle est sa question?
0
poiuytrez3 Messages postés 150 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 17 mars 2009
30 nov. 2007 à 00:01
Salut luthor,
Comment puis-je savoir si il y a ce fameux caractère "passage à la ligne" ?
Pourtant le fichier est censé se terminer derrière le 123 sans aller à la ligne.

Merci de ton aide.

-----------------------------------------------------------------------------------
http://www.mesdevoirs.net -- Corrections de devoirs de mathématiques en ligne
0
poiuytrez3 Messages postés 150 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 17 mars 2009
30 nov. 2007 à 00:49
Ok merci pour ta solution, j'ai utilisé la technique du break.

@+ !

-----------------------------------------------------------------------------------
http://www.mesdevoirs.net -- Corrections de devoirs de mathématiques en ligne
0
Rejoignez-nous