Fin de fichier

[Résolu]
Signaler
Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009
-
Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009
-
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

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
[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(...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
4
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
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
4
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+
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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 :)
Messages postés
557
Date d'inscription
dimanche 25 septembre 2005
Statut
Membre
Dernière intervention
10 mai 2014
4
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?
Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009

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
Messages postés
150
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
17 mars 2009

Ok merci pour ta solution, j'ai utilisé la technique du break.

@+ !

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