Lecture dans un fichier texte avec separateur , ?? - C++ - Programmation
Marsh Posté le 03-04-2006 à 20:24:37
Je t'invite à te documenter sur le mot clef const
Marsh Posté le 03-04-2006 à 20:26:22
oui justement la est mon probleme !!
Je le met ou le mot clef const ?
Parce que j'ai fai un constructeur par recopie pour Produit.
Mias apparament str_Vector.push_back(p) prend un objet constant 'const' en entrée c'est bien ca ?
Marsh Posté le 03-04-2006 à 20:38:53
bon ben j'ai remplacé mon constructeur par recopie, c'est donc devenue (puisque c ca que le vecteur semble vouloir) :
Produit:: Produit(const Produit& )
sauf que maintenant j'ai plein d'erreurs du type:
Produit.cc:41: error: passant « const Produit» comme «cet» argument de «char*
Produit::getNom() » écarte les qualificateurs
Qu'est ce que ca veux dire ?
Marsh Posté le 03-04-2006 à 20:44:26
c'est pas parce que il cherche (const produit& ) que c'est ce qu'il faut lui donner !
renseigne toi sur const !
Marsh Posté le 03-04-2006 à 20:46:38
bon je me suis renseigné lol, mais c'est pas facile de faire le tri parmis l'enorme masse d'informations qu'on trouve.
Mais apparament, dans mon constructeur par recopie il ne lui faut que des truc constants.
Or, dedan, je passe par des accesseurs qui eux ne sont pas déclarés comme constants. Je fais comment pour le faire ?
Marsh Posté le 03-04-2006 à 20:54:26
voila ce que j'ai dans mon constructeur par recopie et dans la méthode qu'il appel:
Code :
|
Marsh Posté le 03-04-2006 à 21:05:34
ouf j'ai trouvé ! ! !
Donc si j'ai bien compri il que toutes les méthodes appelées par le constructeur par recopie soient déclarées constantes, cad qu'elles ne modifient pas l'objet en question. ce qui donne :
// Accesseurs
char* Produit::getRef() const
{ return ref; }
Marsh Posté le 03-04-2006 à 23:02:16
c'est quoi ces char * ? dégage ça et utilise std::string. on est pas l'armée du salut, on debug pas le code c++ + char* ici
Marsh Posté le 04-04-2006 à 09:12:36
Conclusion:
- il fallait se documenter attentivement, et c'est à retenir
- les char* en c++ c'est très très mal
Bon courage pour la suite.
Marsh Posté le 04-04-2006 à 19:04:25
ben disons que c pour mes cours que je fais ca !
Donc je dégage les char* ??
Okay, ca me semble aussi un peu archaique en effet !
J'ai d'ailleurs une question.
Est ce que on peu affecter dynamiquement une string ?
Cad:
std::string s1 = "toto";
std::string s2;
s2 = s1;
Est ce que s2 va prendre comme valeur s1 ?
Marsh Posté le 04-04-2006 à 20:58:55
oui, c'est le but
Citation : Donc si j'ai bien compri il que toutes les méthodes appelées par le constructeur par recopie soient déclarées constantes, cad qu'elles ne modifient pas l'objet en question |
faut pas compliquer les choses, indépendament du constructeur par copie ce qui compte c'est que le parametre est une référence sur un objet constant, tu dois le manipuler comme tel. Sur un objet constant tu ne peux lui appliquer qu'une méthode 'const' (ainsi dans la méthode this est un pointeur sur un objet constant) sans casser son attribut de constance.
La regle générale c'est que quand tu appel une méthode ou une fonction faut vérifier que les types d'objets que tu lui passes respectent le prototype, et en c++ le typage est assez fort pour faire la diférence entre un objet et un objet de meme type mais constant.
Marsh Posté le 04-04-2006 à 21:30:43
bon j'avance j'avance.
J'aurais encore une question.
Mes données dont stockées dans un fichier texte, avec sepratateur tabulation de la forme:
id nom prenom adresse
Sauf que quand il y a un espace dans l'adresse ca bug !
alors comment faire ?
passer par un séparateur , ou ; ??
et je fai comment pour parcourrir tout le fichier jusqu'a ce qu'il n'y ai plus de ligne ?
mais comment est ce que je dois faire ?
pour l'instant je fais :
(j'ai mi une boucle qui parcours 10 lignes juste pour les testes, mais jsai pas comment m'arreter proprement)
Code :
|
Marsh Posté le 04-04-2006 à 22:56:26
Euh oui, c'est moi qui entre toutes les données en fait.
Le format .txt c'est ce qu'il y a de plus simple quoi.
Marsh Posté le 04-04-2006 à 23:01:54
ben met un séparateur oui, sinon tu vas galérer pour savoir si ton espace est un séparateur de données ou un simple espace dans une adresse.
A moins que tu ne lises 3 blocs, et que tu considères que le reste est l'adresse, peu importe le nombre d'espaces.
Marsh Posté le 04-04-2006 à 23:07:49
Ok, je fais comment ensuite en C++ pour récuperer mes données séparées par des virgules ?
et enfin c'est quoi la condition a mettre dans le while pour que je boucle tant qu'il y a dans lignes dans le fichier ?
et re-enfin, (lol et oui j'ai plein de questions jsui un gros noob), il existe une commande en C++ pour vider un fichier .txt de tout son contenu ?
Marsh Posté le 04-04-2006 à 23:23:07
Citation : Ok, je fais comment ensuite en C++ pour récuperer mes données séparées par des virgules ? |
en standard, sur un flux tu dois lires les séparateurs (stream >> an_int >> comma >> ...) sinon avec boost::format ca se parse facilement
Citation : et enfin c'est quoi la condition a mettre dans le while pour que je boucle tant qu'il y a dans lignes dans le fichier ? |
Code :
|
Citation : et re-enfin, (lol et oui j'ai plein de questions jsui un gros noob), il existe une commande en C++ pour vider un fichier .txt de tout son contenu ? |
tu l'ouvres en ecriture, en c++ ca se fait simplement en instanciant un std::ofstream (raii)
Marsh Posté le 04-04-2006 à 23:24:33
Merci bcp pour tout ces renseignements je vais en faire bon usage
Marsh Posté le 05-04-2006 à 00:10:50
j'ai mis ca, mais ca marche pas !
fichier>>id>> comma >>nom>> comma >>prenom>> comma >>adresse_tmp
et meme
fichier>>id>> "," >>nom>> "," >>prenom>> "," >>adresse_tmp
que faire?
Marsh Posté le 05-04-2006 à 00:24:55
1,Jean,Moulin,15RueBidon
l'erreur que j'ai dans le compilateur est la suivante (enfin c'est qu'un bout):
error: ambiguous overload for 'operator>>'
Marsh Posté le 05-04-2006 à 00:37:14
loool ok dsl
Code :
|
Marsh Posté le 05-04-2006 à 00:46:47
quand je mets >>comma>> j'ai ca comme erreur dans le copilateur
error: `comma' undeclared (first use this function)
Marsh Posté le 05-04-2006 à 00:52:36
en francais ca veut dire que comma n'est pas déclaré
le plus simple c'est de mettre un caractere blanc (espace par exemple) comme séparateur si tu lis des string, ou alors utilises boost::format
Marsh Posté le 05-04-2006 à 00:55:48
ben le probleme vien de Adresse qui sera de la forme 15 Rue Machin, et pas collée comme c'est le cas dans mon fichiers.
Marsh Posté le 05-04-2006 à 09:39:02
Ce sont des erreurs de base tout ça, y'a des centaines de pages web qui en traitent.
Marsh Posté le 06-04-2006 à 00:07:56
_darkalt3_ a écrit : Ce sont des erreurs de base tout ça, y'a des centaines de pages web qui en traitent. |
comma non déclaré, c'est une erreur de base. Résoudre le problème du délimiteur virgule, ça n'en est pas un. Et au moins, ça mérite une discussion. Je ne connais pas de moyen simple pour faire cela. ça se fait avec iword/pword, et des docs sur ce sujet ne se trouvent pas précisément par centaines ...
Comme l'a dit skelter, le plus simple est probablement d'utiliser Boost.Format.
Marsh Posté le 06-04-2006 à 09:48:42
Citation : error: `comma' undeclared (first use this function) |
Un automate de lecture de fichiers, c'est du niveau première année d'info
Et des tutoriels sur les stream, y'en a quand meme pas mal.
Marsh Posté le 06-04-2006 à 09:50:11
euh boosst::tokenizer devrait permettre de lever quelques difficultés.
Voire boost::spirit si tu es courageux
Marsh Posté le 06-04-2006 à 23:03:19
_darkalt3_ a écrit : Un automate de lecture de fichiers, c'est du niveau première année d'info |
Qu'est-ce qu'on est censé en déduire ?
_darkalt3_ a écrit : Et des tutoriels sur les stream, y'en a quand meme pas mal. |
Code :
|
Pour implémenter un manipulateur de ce genre, il n'y a pas foule sur le web, et ça a sa place sur ce forum.
D'ailleurs c'est un sujet que je n'ai jamais vu traité ici.
Marsh Posté le 06-04-2006 à 23:47:05
en googlant on tombe sur un topic la dessus
http://www.thescripts.com/forum/thread137675.html
Marsh Posté le 03-04-2006 à 20:18:12
Bonjour !
VOila j'aimerai pouvoir gérer un vecteur qui va contenir des objets de type Produit.
voila ce que j'ai dans la classe TabProduits (qui va utiliser le vector)
Mon fichier .h
et le fichier .cc
et enfin un bon de l'erreur que j'ai:
EDIT--> J'ai changé le titre du post pour s'adapter au denrier probleme !
Message édité par angel92 le 04-04-2006 à 22:20:44