Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2882 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  cauchemare de strings...

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Page Précédente
Auteur Sujet :

cauchemare de strings...

n°834343
glaurung
Posté le 27-08-2004 à 16:38:06  profilanswer
 

Bonjour,  
Si j'ai bien compris les conseils donnés dans ce forum, il ne faut plus utiliser les char * et char[] pour les chaînes de caractères, mais std::string. D'accord, je vais essayer...
 
Premier problème :
 
string szBuffer;
//blabla pour initialiser szBuffer avec un nom de fichier
stream=fopen(szBuffer,"w" );
Mon compilateur ne veut pas d'un string comme premier argument, et je dois donc passer par szBuffer.c_str(). Pas très joli, autant garder les char *.
Mais bon, j'ai aussi lu qu'il faut éviter fopen et cie, et utiliser
fstream.
 
Comme par exemple :  
fstream f("test.txt",ios_base::in | ios_base::out | ios_base::trunc);
question : à quoi correspond le second argument? Fichier ouvert en in/out? mais c'est quoi le io_base::trunc.
 
Ensuite, ce fichier existe déjà, et comporte plusieurs ligne que j'aimerais lire. Quand je fais :  
f.getline(szBuffer,300); même problème que tout à l'heure, le compilateur veut un char *, je ne peux donc pas utiliser les strings?
 
Aussi, j'aimerais bien insérer une ligne à un endroit particulier du fichier, et non à la fin comme le mode append du fopen, c'est possible avec fstream?
 
Merci d'avance de votre aide... :pt1cable:  

mood
Publicité
Posté le 27-08-2004 à 16:38:06  profilanswer
 

n°834347
chrisbk
-
Posté le 27-08-2004 à 16:48:23  profilanswer
 

glaurung a écrit :

Pas très joli, autant garder les char *.


 
Non. les char *, c'est nul moche affreux et chiant. Ca plante de tous les cotés. Ca craint. continue sur std::string, quitte a faire du c_str() quand le besoin s'en fait sentir
 
 

Citation :

Comme par exemple :  
fstream f("test.txt",ios_base::in | ios_base::out | ios_base::trunc);
question : à quoi correspond le second argument? Fichier ouvert en in/out? mais c'est quoi le io_base::trunc.


 
ben la faut aller voir la doc hein ? la msdn par exemple te renseignera avec plaisir. Ca décrit le mode d'ouverture de fichier. les '|' sont la pour 'additionner' les parametres
 
 
 
 

Citation :

Ensuite, ce fichier existe déjà, et comporte plusieurs ligne que j'aimerais lire. Quand je fais :  
f.getline(szBuffer,300); même problème que tout à l'heure, le compilateur veut un char *, je ne peux donc pas utiliser les strings?


 
cf std::getline
 
 

glaurung a écrit :


Aussi, j'aimerais bien insérer une ligne à un endroit particulier du fichier, et non à la fin comme le mode append du fopen, c'est possible avec fstream?


 
nope, ca va etre un brin bordelique, fo ecraser la fin du fichier avec tes nouevlles données et remettre au cul les vieilles données (que tu viens d'ecraser). 'videmment, pour ca faut les avoir sauvé qqpart


Message édité par chrisbk le 27-08-2004 à 16:49:08
n°834364
yawen
Posté le 27-08-2004 à 17:01:30  profilanswer
 

Je vais peut-être me faire taper dessus, mais moi j'utilise les char * (et les strcmp, strcpy, strcat, etc qui vont avec), et ça me pose pas de problème... mais bon, ça reste d'un usage anecdotique, je fais pas des traitements de texte ou des trucs comme ça...

n°834366
glaurung
Posté le 27-08-2004 à 17:02:02  profilanswer
 

Merci pour ta réponse chrisbk.
Je me doutais bien qu'il fallait persévérer avec les string  :whistle:  
 
MSDN est ma source d'inspiration (enfin bon...) donc c'est là que je vais pour les infos. Le problème c'est quand je ne trouve pas / comprends pas...
 

Citation :

trunc, to delete contents of an existing file when its controlling object is created.


 
Si j'ai bien compris, le contenu du fichier est détruit à l'ouverture ?  
 

Citation :

cf std::getline


 
Moui, mais je ne comprends toujours pas... il faut fournir un char * où stocker le résultat, donc comment lui passer un string (ne pas mal interpréter...)? string::c_str() ne marche pas bien sûr, puisque c'est un pointeur sur un constant...
 
Désolé de ne pas tout capter du premier coup...


Message édité par glaurung le 27-08-2004 à 17:02:42
n°834374
masklinn
í dag viðrar vel til loftárása
Posté le 27-08-2004 à 17:08:54  profilanswer
 

getline(stream, string, delimiter)


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°834379
chrisbk
-
Posté le 27-08-2004 à 17:11:39  profilanswer
 

glaurung a écrit :


Moui, mais je ne comprends toujours pas... il faut fournir un char * où stocker le résultat, donc comment lui passer un string (ne pas mal interpréter...)? string::c_str() ne marche pas bien sûr, puisque c'est un pointeur sur un constant...
 
Désolé de ne pas tout capter du premier coup...


 
pas std::string::getLine mais std::getLine
 
genre la  
http://www.google.fr/search?q=cach [...] line&hl=fr

n°834391
masklinn
í dag viðrar vel til loftárása
Posté le 27-08-2004 à 17:26:13  profilanswer
 

chrisbk a écrit :

pas std::string::getLine mais std::getLine
 
genre la  
http://www.google.fr/search?q=cach [...] line&hl=fr


mouais ton post est plus complet que le mien :whistle:


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°834402
glaurung
Posté le 27-08-2004 à 17:34:58  profilanswer
 

Ok, merci bien!

n°834689
glaurung
Posté le 27-08-2004 à 21:55:00  profilanswer
 

Bon, les problèmes continuent.
 
J'ai cherché sur le web en vain, d'ailleurs si vous avez un lien sur une bonne doc, n'hésitez pas...
 
J'ai donc essayé std::getline, et tout va bien pour le stocker dans une chaîne string, par contre, je cherche sans succès une fonction similaire pour lire n caractères et les stocker dans une chaîne string et non char *.
 
j'ai essayé  

Code :
  1. pbuf=in.rdbuf();
  2. pbuf->sgetn(szBufferIn,10);

 
pour lire 10 caractères à stocker dans szBuffer, mais même problème que tout à l'heure : sgetn veut un char * comme premier paramètre.
 
Je veux bien utiliser string plutôt que char*, mais je bute systématiquement sur les fonctions à utiliser.
 
Merci pour l'aide...

n°834732
Taz
bisounours-codeur
Posté le 27-08-2004 à 22:40:54  profilanswer
 

tu le fais expres ou quoi ? tu peux faire ça avec une string ou alors avec istream::read :o

mood
Publicité
Posté le 27-08-2004 à 22:40:54  profilanswer
 

n°834737
glaurung
Posté le 27-08-2004 à 22:49:16  profilanswer
 

Bien sûr que je fais exprès. D'ailleurs je m'étonne que tu aies mis tant de temps à démarrer. On se fait vieux?
Non sérieusement, j'ai bien essayé avec istream::read, mais il veut un char * comme premier argument...

n°834757
Taz
bisounours-codeur
Posté le 27-08-2004 à 23:01:11  profilanswer
 

ça change quoi ?
à partir du moment ou tu as la taille, tout va : vecotr, char[]

n°834762
glaurung
Posté le 27-08-2004 à 23:06:32  profilanswer
 

Je voulais juste rempacer systématiquement mes utilisations de char * et char[] par des strings, mais en effet, dans ce cas précis, il n'y a aucun risque puisque la longueur est connue. Donc dans ce cas là je vais utiliser un char. Je pensais juste que je pouvais systématiquement me passer des char[]. J'avais vu sur un site (me souviens plus lequel) qu'en C++, il fallait éviter les tableaux de char pour représenter les chaînes...

n°834832
Taz
bisounours-codeur
Posté le 28-08-2004 à 00:04:00  profilanswer
 

les tableaux sont pas dangereux, sizeof fait bien son travail.

n°834881
HelloWorld
Salut tout le monde!
Posté le 28-08-2004 à 00:47:17  profilanswer
 

glaurung, je te conseille de lire une bonne FAQ sur le C++, ça t'évitera plein de problèmes de ce genre.
http://www.parashift.com/c++-faq-lite/
(il y a une traduction française, mais elle n'est pas tout à fait à jour)
http://www.cmla.ens-cachan.fr/Util [...] s/C++/FAQ/
Par exemple dans ton cas :
http://www.cmla.ens-cachan.fr/Util [...] AQ/#string
http://www.parashift.com/c++-faq-l [...] l#faq-15.1


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°834958
blackgodde​ss
vive le troll !
Posté le 28-08-2004 à 03:23:01  profilanswer
 

yawen a écrit :

Je vais peut-être me faire taper dessus, mais moi j'utilise les char * (et les strcmp, strcpy, strcat, etc qui vont avec), et ça me pose pas de problème... mais bon, ça reste d'un usage anecdotique, je fais pas des traitements de texte ou des trucs comme ça...


 
 
la cat C c'est à coté ...


---------------
-( BlackGoddess )-
n°834962
el muchach​o
Comfortably Numb
Posté le 28-08-2004 à 07:58:09  profilanswer
 

HelloWorld a écrit :

glaurung, je te conseille de lire une bonne FAQ sur le C++, ça t'évitera plein de problèmes de ce genre.
http://www.parashift.com/c++-faq-lite/
(il y a une traduction française, mais elle n'est pas tout à fait à jour)
http://www.cmla.ens-cachan.fr/Util [...] s/C++/FAQ/
Par exemple dans ton cas :
http://www.cmla.ens-cachan.fr/Util [...] AQ/#string
http://www.parashift.com/c++-faq-l [...] l#faq-15.1


 
Merci HelloWorld pour cette FAQ qu'il faut rajouter aux références C++ (si ce n'est déjà fait).
Il y a d'ailleurs des réponses à des questions qui reviennent souvent, comme : http://www.parashift.com/c++-faq-l [...] #faq-16.15


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°834977
cris56
Posté le 28-08-2004 à 10:06:42  profilanswer
 

BlackGoddess a écrit :

la cat C c'est à coté ...


 
je veux bien qu'il soit fortement conseillé en c++ d'utiliser std::string plutot que c-style string mais ca doit pas etre non plus une obligation, si on sait ce qu'on fait et qu'on a besoin d'une certaine vitesse d'execution ?

n°834985
Taz
bisounours-codeur
Posté le 28-08-2004 à 10:37:52  profilanswer
 

non. c'est stupide comme réflexion. y a des milliards de langages avec un type string (et immutable souvent), on a jamais rien trouvé à redire

n°834994
chrisbk
-
Posté le 28-08-2004 à 11:32:46  profilanswer
 

cris56 a écrit :

je veux bien qu'il soit fortement conseillé en c++ d'utiliser std::string plutot que c-style string mais ca doit pas etre non plus une obligation, si on sait ce qu'on fait et qu'on a besoin d'une certaine vitesse d'execution ?


 
jvais te dire, les char * ca m'a amené l'inverse. A jamais savoir si je pouvais desallouer un char * ou pas, j'ai un jour terminé avec 20Mo de char * en leaks.  
Ca a sonné leur glas, définitif.

n°834998
docmaboul
Posté le 28-08-2004 à 11:47:10  profilanswer
 

Et quand vous avez une fuite d'eau, vous changez toute la plomberie?

n°834999
chrisbk
-
Posté le 28-08-2004 à 11:49:21  profilanswer
 

Si un PQ m'irrite les fesses, je change de marque et je jette mon vieux stock
 
on va aller loin avec de telles comparaisons

n°835002
docmaboul
Posté le 28-08-2004 à 12:02:28  profilanswer
 

le char*, c'est beau, c'est bien, c'est efficace et ça roxe en perfs.
 
C'est mieux? :D

n°835008
chrisbk
-
Posté le 28-08-2004 à 12:04:24  profilanswer
 

ca roxx en perf, ca roxx en perf, c'est tres vite dit. Et ca donne tellement de cheveux blanc a chaque fois qu'on fait un delete [] / free dessus que ca me semble vraiment un choix peu recommandable.

n°835010
schnapsman​n
Zaford Beeblefect
Posté le 28-08-2004 à 12:05:13  profilanswer
 

JE VOUS DEMANDE DE VOUS ARRETER :o


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°835012
chrisbk
-
Posté le 28-08-2004 à 12:05:47  profilanswer
 

schnapsmann a écrit :

JE VOUS DEMANDE DE VOUS ARRETER :o


Quand ton PQ te pique les fesses, tu changes toute la plomberie ?

n°835020
schnapsman​n
Zaford Beeblefect
Posté le 28-08-2004 à 12:08:05  profilanswer
 

JE ME TORCHE AVEC LES TUYAUX /O


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
n°835023
docmaboul
Posté le 28-08-2004 à 12:11:31  profilanswer
 

chrisbk a écrit :

ca roxx en perf, ca roxx en perf, c'est tres vite dit.


 
Tout dépend de l'usage qu'on en fait. C'est sûr que si c'est pour faire une flopée de strcat sur sa tronche, mieux vaut se faire une structure, une classe ou un équivalent (mais quand même avec un char* dedans :D)
 

Citation :

Et ca donne tellement de cheveux blanc a chaque fois qu'on fait un delete [] / free dessus que ca me semble vraiment un choix peu recommandable.


 
Je ne vois pas de quoi vous parlez.

n°835025
chrisbk
-
Posté le 28-08-2004 à 12:17:02  profilanswer
 

DocMaboul a écrit :


Je ne vois pas de quoi vous parlez.


 
du code de qualité qu'on peut ecrire, genre ce petit exemple, certes debile, mais parlant
 

Code :
  1. char * prout(int a)
  2. {
  3. if (a==0)
  4. return "zero";
  5. char * res = new char[20];
  6. sprintf(res,"%d",a);
  7. return res;
  8. }


 
Delete le resultat, delete pas ? ou alors fo tout blinder a coup de strdup(). Facile a dire, mais quand les char * commence a se balader dans l'ensemble d'un programme, ca devient un peu trop festif a mon gout. Je sacrifie a l'aise 5 octets par char * et une poignée de cycle pour laisser ce plaisir la a d'autre, le compilo par ex.
 
 

n°835031
docmaboul
Posté le 28-08-2004 à 12:25:31  profilanswer
 

Citation :

quand les char * commence a se balader dans l'ensemble d'un programme, ca devient un peu trop festif a mon gout.


 
Ah mais ce n'est pas la même chose. Qu'on dise "les char*, je trouve ça peu ragoûtant", je comprends tout à fait. Par contre, "les char*, c'est d'la merde", ça ne passe pas. Je trouve que le premier cas est sincère et que le deuxième est une connerie. Ca me fait penser aux styles d'indentation: on trouve toujours des ayatollahs pour vous expliquer que leur style est le meilleur et que le reste, c'est de la merde.
 
Cela dit, je comprends bien votre exemple mais si on prend toutes les bêtises qu'on peut faire en C/C++ avec chaque instruction, on change de langage (voire de métier) :D

n°835036
chrisbk
-
Posté le 28-08-2004 à 12:29:18  profilanswer
 

DocMaboul a écrit :


Cela dit, je comprends bien votre exemple mais si on prend toutes les bêtises qu'on peut faire en C/C++ avec chaque instruction, on change de langage (voire de métier) :D


 
Ah ben ca, je dis pas, et donc de mon point de vue tout ce qu'on peut faire pour supprimer ces points attire-bug du langage est bon a prendre  
 

n°835043
docmaboul
Posté le 28-08-2004 à 12:49:37  profilanswer
 

chrisbk a écrit :

Ah ben ca, je dis pas, et donc de mon point de vue tout ce qu'on peut faire pour supprimer ces points attire-bug du langage est bon a prendre


 
A ce moment-là, il faut supprimer tout ce qui est allocation dynamique (enfin, je veux dire la gestion) et les pointeurs.
 
Et puis l'alcool qui rend saoul
et puis les femmes qui ont des envies de sexe
et aussi les enfants qui hurlent quand ils sont contents
et comme jadis, on brûle à la St-Jean ces foutus chats (qui marchent sur les claviers quand ils veulent des câlins)!
 
pour ma part, ces incarnations du démon m'ont fait faire plus de bugs que les char*... [:ddr555]

n°835092
chrisbk
-
Posté le 28-08-2004 à 13:54:01  profilanswer
 

DocMaboul a écrit :

A ce moment-là, il faut supprimer tout ce qui est allocation dynamique (enfin, je veux dire la gestion) et les pointeurs.


fo rester raisonnable aussi, hein
 
 
[citation=835043,0,32][nom]DocMaboul a écrit[/nom
et comme jadis, on brûle à la St-Jean ces foutus chats (qui marchent sur les claviers quand ils veulent des câlins)!
[/citation]
 
putain, oué, c relou ca, apres y'a plein de poils dans le clavier, c relou

n°835117
el muchach​o
Comfortably Numb
Posté le 28-08-2004 à 14:48:17  profilanswer
 

DocMaboul a écrit :

Citation :

quand les char * commence a se balader dans l'ensemble d'un programme, ca devient un peu trop festif a mon gout.


 
Ah mais ce n'est pas la même chose. Qu'on dise "les char*, je trouve ça peu ragoûtant", je comprends tout à fait. Par contre, "les char*, c'est d'la merde", ça ne passe pas. Je trouve que le premier cas est sincère et que le deuxième est une connerie.
 
Cela dit, je comprends bien votre exemple mais si on prend toutes les bêtises qu'on peut faire en C/C++ avec chaque instruction, on change de langage (voire de métier) :D


 
Disons que quand on en a marre de relire/débugger/réécrire pourla dixime fois le code tout pourri des débutants (et des moins débutants) qui utilisent le char* à tout va parce que c'est la seule chose qu'ils ont apprise à l'école, on finit par leur dire simplement : "touche pas à ça, c'est pas pour toi, tu vas encore nous pondre une daube infâme".
Goto aussi c'est rapide, il n'y a pas longtemps encore, je réécrivais du code entièrement fait avec du if...goto. Ca marchait, certes, mais c'est du code de merde, et son auteur peut avoir honte de son boulot qui ne vaut pas un clou.


Message édité par el muchacho le 28-08-2004 à 14:53:21

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°835223
HelloWorld
Salut tout le monde!
Posté le 28-08-2004 à 19:01:09  profilanswer
 

cris56 a écrit :

je veux bien qu'il soit fortement conseillé en c++ d'utiliser std::string plutot que c-style string mais ca doit pas etre non plus une obligation, si on sait ce qu'on fait et qu'on a besoin d'une certaine vitesse d'execution ?


DocMaboul a écrit :

le char*, c'est beau, c'est bien, c'est efficace et ça roxe en perfs.
 
C'est mieux? :D


Perdu!
Les std::string sont souvent plus rapides, et pour une seule et très bonne raison : leur longueur est connues. Donc size() a un tps d'exécution constant, alors que strlen() non.
Sachant qu'il faut faire un strlen pour de strucs genre strcat, etc... DTC les char *.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°835253
cricri_
Posté le 28-08-2004 à 20:04:57  profilanswer
 

Pas d'accord ... moi j'ai fait un prog d'analyse de lignes dans un fichier, j'ai fait 2 versions, une avec des char [] l'autre avec des string, j'ai gardé la dernière car plus propre, mais la version avec char est tout de même plus rapide de près de 15-20% ;)

n°835302
docmaboul
Posté le 28-08-2004 à 21:55:50  profilanswer
 

Cricri_ a écrit :

Pas d'accord ... moi j'ai fait un prog d'analyse de lignes dans un fichier, j'ai fait 2 versions, une avec des char [] l'autre avec des string, j'ai gardé la dernière car plus propre, mais la version avec char est tout de même plus rapide de près de 15-20% ;)


 
et je mettrais un poil de cul à couper qu'un profiler montrerait que cette perte est dûe à des (ré)allocations inutiles mais induites par la facilité de coding.

n°835303
docmaboul
Posté le 28-08-2004 à 21:56:51  profilanswer
 

HelloWorld a écrit :

Perdu!
Les std::string sont souvent plus rapides, et pour une seule et très bonne raison : leur longueur est connues. Donc size() a un tps d'exécution constant, alors que strlen() non.
Sachant qu'il faut faire un strlen pour de strucs genre strcat, etc... DTC les char *.


 
ben si il y a la place DMC pour un char *, il y a aussi la place pour mettre un int, hein :o

n°835397
cricri_
Posté le 29-08-2004 à 09:57:37  profilanswer
 

DocMaboul a écrit :

et je mettrais un poil de cul à couper qu'un profiler montrerait que cette perte est dûe à des (ré)allocations inutiles mais induites par la facilité de coding.


Certainement, en fait il faudrait pouvoir régler la "granularité" (pas sûr que cela soit le bon terme ...), genre, sachant que je traite des lignes, je mettrait une taille de base de 256 octets qui doit suffire dans la majorité des cas, et puis s'il y a besoin de plus ben le système réalloue 256 octets, etc ...

n°835441
glaurung
Posté le 29-08-2004 à 11:46:44  profilanswer
 

HelloWorld a écrit :

glaurung, je te conseille de lire une bonne FAQ sur le C++, ça t'évitera plein de problèmes de ce genre.
http://www.parashift.com/c++-faq-lite/
(il y a une traduction française, mais elle n'est pas tout à fait à jour)
http://www.cmla.ens-cachan.fr/Util [...] s/C++/FAQ/
Par exemple dans ton cas :
http://www.cmla.ens-cachan.fr/Util [...] AQ/#string
http://www.parashift.com/c++-faq-l [...] l#faq-15.1


 
Merci HelloWorld, pour cette intéressante lecture en perspective. J'ai pas encore tout lu, mais je cerne déjà un peu mieux la question.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  cauchemare de strings...

 

Sujets relatifs
comparaison de stringsrecherche de strings
Les dessous des Strings.[Script Visual Basic] Recherches de strings basiques
Encore une fonction sur les Strings....Operation sur des strings
[vba] cherche une commande pour un eoperation sur les strings[C, C++] faire un array dynamique de strings...
[VBA] manipulation des stringsC# Help ! opération sur les strings
Plus de sujets relatifs à : cauchemare de strings...


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)