poiuytrez3
Messages postés150Date d'inscriptiondimanche 28 septembre 2003StatutMembreDernière intervention17 mars 2009
-
29 nov. 2007 à 00:59
poiuytrez3
Messages postés150Date d'inscriptiondimanche 28 septembre 2003StatutMembreDernière intervention17 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
// 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);
}
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
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 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:
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(...
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 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.
ndubien
Messages postés557Date d'inscriptiondimanche 25 septembre 2005StatutMembreDernière intervention10 mai 20144 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 ;)
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 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 :)
ndubien
Messages postés557Date d'inscriptiondimanche 25 septembre 2005StatutMembreDernière intervention10 mai 20144 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?
poiuytrez3
Messages postés150Date d'inscriptiondimanche 28 septembre 2003StatutMembreDernière intervention17 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
poiuytrez3
Messages postés150Date d'inscriptiondimanche 28 septembre 2003StatutMembreDernière intervention17 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