Question C++ facile pour les experts - C++ - Programmation
Marsh Posté le 02-05-2002 à 11:54:38
La commande "system" serait une solution :
system(nomDeLExecutable > fichier)
Mais je souhaiterais le faire a partir du code...
Il doit y avoir un lien entre les fstream et les ostream, du fait de l'heritage..
Marsh Posté le 02-05-2002 à 12:01:07
C'est facile pour les experts.
C'est facile aussi pour ceux qui veulent bien bouger un peu leurs fesses, et chercher dans une doc...
Si t'utilises les MFC, cherche du coté de CFile
Sinon, comme en C simple, utilises fopen et compagnie.
Marsh Posté le 02-05-2002 à 12:02:20
fstream *f;
f = new fstream;
f->open("c:\\fichier.txt", ...);
f << "ligne de texte " << endl;
f->close();
delete f;
J'imagine que c'est un truc dans ce genre. Je n'ai utilisé ça qu'une fois, et je n'ai plus le code-source
edit: j'avais pas vu "sans enlever le cout"... je vois pas trop ce que ça a à voir
[jfdsdjhfuetppo]--Message édité par antp le 02-05-2002 à 12:03:31--[/jfdsdjhfuetppo]
Marsh Posté le 02-05-2002 à 12:04:14
Non, je n'utilise pas les MFC.
Je connais un moyen en utilisant popen, mais n'y a-t-il pas un autre moyen ?????
Marsh Posté le 02-05-2002 à 12:06:03
solvene a écrit a écrit : Non, je n'utilise pas les MFC. Je connais un moyen en utilisant popen, mais n'y a-t-il pas un autre moyen ????? |
popen !? connais pas !
antp viens de te donner autre chose...
Marsh Posté le 02-05-2002 à 12:09:35
antp a écrit a écrit : fstream *f; f = new fstream; f->open("c:\\fichier.txt", ...); f << "ligne de texte " << endl; f->close(); delete f; |
Oui, merci, ca je connais bien sur, mais je ne veux garder le cout...
Marsh Posté le 02-05-2002 à 14:02:07
solvene a écrit a écrit : Soit le program suivant: main () { cout << "je souhaite ecrire dans un fichier" << endl; } Quelles sont les quelques lignes de code qui me permettraient d'ecrire dans un fichier "myfic" par exemple plutot que dans le stdout? ps: sans enlever le cout ... merci |
"cout" est la sortie standard. Tu peux pas ecrire dans un fichier en utilisant "cout". C'est comme si tu dis "je veux passer par la fenetre pas par la porte, mais je veux quand meme utiliser la porte".
Sinon, tu peux rediriger la sortie standard vers un fichier de deux manieres:
- soit tu utilises les fonctions "dup" ou "dup2"
- soit tu lances ton .exe comme ca: mon_prog.exe > out.txt
C'est peut-etre pas ca que tu veux
antp: ton "new" sert a rien, a part perdre du temps a l'execution. Vaut mieux creer les objets sur la pile.
Marsh Posté le 02-05-2002 à 14:20:54
Ouais j'ai tendance à faire à cause de C++Builder
Une bonne partie des objets de la VCL ne peuvent être crée que via un new.
[jfdsdjhfuetppo]--Message édité par antp le 02-05-2002 à 14:21:27--[/jfdsdjhfuetppo]
Marsh Posté le 02-05-2002 à 19:13:03
antp a écrit a écrit : Ouais j'ai tendance à faire à cause de C++Builder Une bonne partie des objets de la VCL ne peuvent être crée que via un new. |
Je savais pas, je connais pas la VCL (eh oui, je suis un suppot de Microsoft, je suis meme certifie pour les MFC, cette grosse dauble, c'est pour dire).
Comment ca se fait pour la VCL, tu veux dire que cette lib detruit automatiquement certains objets (genre les controles, c'est le cas dans la lib wxWindows) ?
Si non, jette un coup d'oeil a www.boost.org , il y a des smarts pointers sympas. Exemple:
#include <boost/smart_ptr.hpp>
{
boost::scoped_ptr<Voiture> pvoiture(new Voiture);
}
Et hop quand il sort du bloc, il detruit automatiquement ton objet (ce qui est bien car si tu mets un "return" ou une exception au milieu, t'es garanti que l'objet sera detruit).
J'en use et j'en abuse de cette lib.
Marsh Posté le 02-05-2002 à 20:12:18
les VCL ce sont des librairies en Pascal à l'origine (Delphi) donc il y a certaines contraintes apparemment. En Pascal tu ne peux pas créer un objet directement :
obj1: TObjet; // équivaut à TObjet *obj1;
obj1 := TObjet.Create; // équivaut à obj1 = new TObjet;
obj1.Free; // équivaut à if(obj1 != NULL) delete obj1;
Je suppose que c'est à cause de ça qu'on est obligé d'utiliser le "new".
Par contre tous les objets visuels (d'une fenêtre, les boutons etc...) sont détruits automatiquement par la fenêtre, donc on fait des new mais jamais de delete.
Sinon pour l'histoire des pointeurs détruits lors des return, y a un truc sympa en Pascal que Borland a rajouté au C++ : try/finally.
obj1 := TObjet.Create;
try
(plein de trucs)
finally
obj1.Free;
end;
En théorie peu importe ce qui se passe entre le try et le finally le programme passera toujours par finally, que ce soit une exception ou un Exit (return du C).
En C++Builder c'est devenu
try
{
}
__finally
{
}
[jfdsdjhfuetppo]--Message édité par antp le 02-05-2002 à 20:16:27--[/jfdsdjhfuetppo]
Marsh Posté le 02-05-2002 à 20:54:08
Merci pour les precisions sur la VCL. Comme dirait mon futur-ex-petit chef: "je le mettrai sur mon CV" :-)
[citation]
obj1.Free; // équivaut à if(obj1 != NULL) delete obj1;
[/citation]
Note que ce n'est pas la peine de teste si l'objet est NULL. "delete 0" ne fait rien (selon notre ami a tous Bjarne Stroustrup). Par contre:
dekete obj1; obj1 = 0;
[citation]
Sinon pour l'histoire des pointeurs détruits lors des return, y a un truc sympa en Pascal que Borland a rajouté au C++ : try/finally.
[/citation]
Ca existe en Java et c'est bien. Par contre, j'aime pas trop les extensions proprio aux langages de programmation, rien que parce qu'on peut s'y habituer !
Marsh Posté le 02-05-2002 à 21:05:52
delete NULL ne plante pas ?
Ha bhen j'aurais appris un truc
En Pascal il y a obj.Destroy qui plante si c'est nil (NULL), et obj.Free qui fait le test avant.
Y a aussi FreeAndNil(Obj) qui met à nil après avoir fait le Free...
Marsh Posté le 02-05-2002 à 11:45:37
Soit le program suivant:
main ()
{
cout << "je souhaite ecrire dans un fichier" << endl;
}
Quelles sont les quelques lignes de code qui me permettraient d'ecrire dans un fichier "myfic" par exemple plutot que dans le stdout?
ps: sans enlever le cout ...
merci