OVH Cloud OVH Cloud

Création fichier de config ...

63 réponses
Avatar
Manu
Je suis on ne peut plus débutant en c/c++ , et je suis confronté à un
problème que je n'arrive pas à résoudre.
J'ai crée un petit client irc de base dans le but d'en faire une espèce de
robot à tout faire que j'améliorerai en fonction de mes idées du moment ...

ceci dit , 2 questions :

1) comment faire de mon programme un exe tournant en "toile de fond" ( cad
pas etre obligé de conserver la fenetre de ligne de cmd sous XP pour que le
prog tourne ) ?

2) apres un premier lancement , je voudrai crée un fichier de config
regroupant les infos principales ( server , channel , nickname .. )
permettant ensuite de relancer le client a partir de ce fichier sans avoir a
indiquer les arg en ligne de commande

void config_pass(int i , char* data)
{
FILE* Config;
Config = fopen("iBot.txt","w");
if (i == 1) { printf("Server : "); fputs(data, Config); fputs("\n",
Config); }
if (i == 2) { printf("Port : "); fputs(data, Config); }
if (i == 3) { printf("Channel : "); /* printf(data, Config); printf("\n",
Config); */ }
( ... )
}

bon je me doute que ca doit être un peu fouilli et pas du tout optimisé ...
i correspond en gros au nombre d'arguments en ligne de commande

en fait , je cherche un moyen de faire le fichier iBot.txt de facon
convenable , parce que avec tous mes essais ( essais avec fputs / fwrite /
... enfin un peu tout ) , le data correspondant a la chaine de caractères de
chaque arg s'ecrit bien dans le fichier .txt , mais uniquement sur la
premiere ligne , et ce en effacant bien entendu ce qui avait été ecrit
précédemment

exemple : server irc.epiknet.org
port : 6667
->> donne en premiere ligne : 6667epiknet.org au deuxieme tour

donc en gros , j'aimerai savoir comment faire sauter une ligne pour avoir
chaque ch de caractères de chaque arg sur une ligne différente :)

bon je sais c c confus ... pardonnez mon langage de débutant , j'ai voulu
etre le plus clair possible

merci de votre aide et bon week end !

10 réponses

Avatar
_M.B._
"Gabriel Dos Reis" a écrit dans le message
news:
Loïc Joly writes:

| Gabriel Dos Reis wrote:
|
|
| > OK. Mais que #1 avec la correction ?
|
| Bin, du coup, je dirais que la ligne affiche 8, mais je suppose qu'il
| doit y avoir un truc.

Oui. En C++, il afficherait 8 comme on s'y attendrait. En C99, cela peut
reformater le disque dur. En C90, c'est une erreur. .

| > |
| > | > Est-ce que #2 est bien formé ?
| > |
| > | J'aurais intuitivement dit oui, mais je suppose que la vérité est
ailleur.

| >
| > donc, "p" pointe sur un objet ? C'est ça ? Si oui, quelle sa durée de
| > stockage ?
|
| Un objet temporaire qui existe jusqu'à la fin de l'exécution de
| l'instruction ?

Ce n'est pas une durée de stockage, ça.



T'as rien de mieux a faire que de venir taper ta frime ici
avec du C trop mal ecrit pour etre lisible et qui est l'exemple
meme de ce qu'il ne faut pas faire en C.

Tu construis ton argumentation sur la complexite du C en prenant
comme exemple une exception qui confirme la regle.

C'est de la malhonnetete intellectuelle, c'est completement HS,
et ca ne rime a rien.

Microcosme, disais-je ...

MB

Avatar
Christophe Lephay
"_M.B._" a écrit dans le message de
news:blp3g5$gqc$
T'as rien de mieux a faire que de venir taper ta frime ici
avec du C trop mal ecrit pour etre lisible et qui est l'exemple
meme de ce qu'il ne faut pas faire en C.

Tu construis ton argumentation sur la complexite du C en prenant
comme exemple une exception qui confirme la regle.

C'est de la malhonnetete intellectuelle, c'est completement HS,
et ca ne rime a rien.

Microcosme, disais-je ...


Mais pourquoi est-il si méchant... ;)

Chris

Avatar
Gabriel Dos Reis
"_M.B._" writes:

| Tu construis ton argumentation sur la complexite du C en prenant
| comme exemple une exception qui confirme la regle.

Cela répondait à l'assertion était que le C est plus facile à maîtrisé.

Et en passant, la question sur la durée ed stockage n'est pas
l'exception qui confirme la règle.

-- Gaby
Avatar
James Kanze
"Manu" writes:

|> Je suis on ne peut plus débutant en c/c++ , et je suis
|> confronté à un problème que je n'arrive pas à
|> résoudre.

|> J'ai crée un petit client irc de base dans le but d'en faire une
|> espèce de robot à tout faire que j'améliorerai en fonction
|> de mes idées du moment ...

|> ceci dit , 2 questions :

|> 1) comment faire de mon programme un exe tournant en "toile de fond"
|> ( cad pas etre obligé de conserver la fenetre de ligne de cmd
|> sous XP pour que le prog tourne ) ?

Ça dépend fortement du système. Je connais bien la réponse
pour des systèmes Posix, mais je doute fort que ça t'aidera:-). Il
faudrait donc démander dans un groupe spécialisé Windows.

|> 2) apres un premier lancement , je voudrai crée un fichier de
|> config regroupant les infos principales ( server , channel ,
|> nickname .. ) permettant ensuite de relancer le client a partir de
|> ce fichier sans avoir a indiquer les arg en ligne de commande

|> void config_pass(int i , char* data)
|> {
|> FILE* Config;
|> Config = fopen("iBot.txt","w");
|> if (i == 1) { printf("Server : "); fputs(data, Config); fputs("n",
|> Config); }
|> if (i == 2) { printf("Port : "); fputs(data, Config); }
|> if (i == 3) { printf("Channel : "); /* printf(data, Config); printf("n",
|> Config); */ }
|> ( ... )
|> }

|> bon je me doute que ca doit être un peu fouilli et pas du tout
|> optimisé ... i correspond en gros au nombre d'arguments en ligne
|> de commande

|> en fait , je cherche un moyen de faire le fichier iBot.txt de facon
|> convenable , parce que avec tous mes essais ( essais avec fputs /
|> fwrite / ... enfin un peu tout ) , le data correspondant a la chaine
|> de caractères de chaque arg s'ecrit bien dans le fichier .txt ,
|> mais uniquement sur la premiere ligne , et ce en effacant bien
|> entendu ce qui avait été ecrit précédemment

|> exemple : server irc.epiknet.org
|> port : 6667
|> ->> donne en premiere ligne : 6667epiknet.org au deuxieme tour

Bien, à ta place, je me servirai plutôt des ofstream que des
FILE*. C'est plus facile. Mais dans l'occurance, les symtomes que tu
décris suggère que tu as fermé et puis réouvert le fichier
à chaque ligne. Si tu ouvres le fichier en écriture, et tu le
laisses ouvert jusqu'à ce que tu as tout écrit, tu ne dois pas
avoir ce problème.

|> donc en gros , j'aimerai savoir comment faire sauter une ligne pour
|> avoir chaque ch de caractères de chaque arg sur une ligne
|> différente :)

int
main( int argc, char** argv )
{
int result = EXIT_FAILURE ;
std::ofstream dest( "args.txt") ;
if ( ! dest ) {
std::cerr << "Le fichier "args.txt" n'a pas pu être créén" ;
} else {
for ( int i = 0 ; i < argc ; ++ i ) {
dest << i << ": " << argv[ i ] << 'n' ;
}
dest.close() ;
if ( dest ) {
result = EXIT_SUCCESS ;
} else {
std::cerr << "Erreur d'écriture dans "args.txt"n" ;
}
}
return result ;
}

À adapter selon tes besoins.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Fabien LE LEZ writes:

|> On Sat, 4 Oct 2003 18:03:26 +0200, "Manu" wrote:

|> >1) comment faire de mon programme un exe tournant en "toile de
|> >fond" ( cad pas etre obligé de conserver la fenetre de ligne de
|> >cmd sous XP pour que le prog tourne ) ?

|> fr.comp.os.ms-windows.programmation

Tu pourrais lui expliquer pourquoi.

|> >void config_pass(int i , char* data)
|> >{
|> > FILE* Config;
|> > Config = fopen("iBot.txt","w");
|> > if (i == 1) { printf("Server : ");

|> Tout ça est du C, pas du C++ -> fr.comp.lang.c

Ce n'est pas la façon idiomatique C++ de faire, mais c'est bien du
C++ quand même.

|> Note pour éviter les trolls : un compilateur C++ compilera ce
|> code, car il compile la plupart du code C, mais le code C++ pour
|> faire ça serait très différent -- il utiliserait
|> std::string, les fstream, etc.

La norme C++ définit bien fopen, printf, etc. Elles font bien partie
de C++. Mais pour des raisons de compatibilité C, surtout. C'est du
C++, mais ce n'est pas comme ça qu'écrirait un bon programmeur
C++.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Gabriel Dos Reis writes:

|> Loïc Joly writes:

|> | que le C++ (dans le sens son étendue est plus limitée, il
|> | est plus facile de le maitriser complètement).

|> ce point n'est pas évident.

Je crois qu'il parlait de maîtriser le langage. Il est bien plus
facile à maîtriser le langage C que le langage C++. En revanche,
la maîtrise du langage n'est ni suffisant ni forcement nécessaire
pour maîtriser la programmation dans ce langage, et à mon avis, il
est bien plus simple à maîtriser la programmation en C++ qu'en C.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Gabriel Dos Reis writes:

|> #include <stdio.h>

|> struct Point {
|> int coord[2];
|> };

|> void print_value(int *p)
|> {
|> printf("%d", *p);
|> }

|> void set_value(int *p, v)
|> {
|> *p = v;
|> }

|> struct Point make_point(int a, int b)
|> {
|> struct Point p = {{a, b}};

D'après mes souvenirs, c'est une erreur. On n'a pas (ou on n'avait
pas) droit à plus de niveau de {} qu'il y avait de niveau dans les
données à initialiser.

|> return p;
|> }

|> int main()
|> {
|> print_value(set_value(make_point(3, 4), 8)); // #1

Si ça compile, tu as un problème de compilateur. D'abord, l'appel
de set_value est illégal, parce que tu ne peux pas passer une struct
Point à un int*. Ensuite, l'appel de print_value est illégal,
parce que tu ne peux pas passer un void à un int*.

|> int *p = make_point(467, 39).coord; // #2

C'est effectivement une subtilité. Où d'ailleurs les compilateurs
ne sont pas tous d'accord.

|> }

|> Que fait #1 ?

Erreur de compilation.

|> Est-ce que #2 est bien formé ?

Il me semble qu'il y a eu une TC à ce sujet, mais je ne me rappelle
pas la réponse. (A priori, j'aurais dis non, parce que prendre
l'adresse suppose un lvalue, et la valeur de retour d'une fonction n'est
pas un lvalue.)

Mais je crois que C++ a le même problème. C'est donc qu'il n'y a
pas de différence à cet égard.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Emmanuel Delahaye writes:

|> In 'fr.comp.lang.c++', Gabriel Dos Reis wrote:

|> > #include <stdio.h>

|> > struct Point {
|> > int coord[2];
|> > };

|> > void print_value(int *p)
|> > {
|> > printf("%d", *p);
|> > }

|> > void set_value(int *p, v)

|> Pas du C.

Comment pas du C. C'est du C parfaitement valable.

|> > {
|> > *p = v;
|> > }

|> > struct Point make_point(int a, int b)
|> > {
|> > struct Point p = {{a, b}};
|> > return p;
|> > }

|> > int main()
|> > {
|> > print_value(set_value(make_point(3, 4), 8)); // #1

|> Pas du C. (types incompatibles)

Tout à fait. Il a proposé une correction, mais je ne vois toujours
pas comment l'appel de set_value est légal, même après sa
correction.

|> > int *p = make_point(467, 39).coord; // #2
|> > }

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Gabriel Dos Reis
James Kanze writes:

| Gabriel Dos Reis writes:
|
| |> #include <stdio.h>
|
| |> struct Point {
| |> int coord[2];
| |> };
|
| |> void print_value(int *p)
| |> {
| |> printf("%d", *p);
| |> }
|
| |> void set_value(int *p, v)
| |> {
| |> *p = v;
| |> }
|
| |> struct Point make_point(int a, int b)
| |> {
| |> struct Point p = {{a, b}};
|
| D'après mes souvenirs, c'est une erreur.

c'est une erreur uniquement en K&R, mais pas en C90 et version ultérieure.

| On n'a pas (ou on n'avait
| pas) droit à plus de niveau de {} qu'il y avait de niveau dans les
| données à initialiser.

Ça c'est uniquement vrai en C K&R.

[...]

| |> int *p = make_point(467, 39).coord; // #2
|
| C'est effectivement une subtilité. Où d'ailleurs les compilateurs
| ne sont pas tous d'accord.

C'est une erreur en C90, et c'est bien formé en C99, mais avec
d'autres subtilités en plus.


| |> Est-ce que #2 est bien formé ?
|
| Il me semble qu'il y a eu une TC à ce sujet, mais je ne me rappelle
| pas la réponse. (A priori, j'aurais dis non, parce que prendre
| l'adresse suppose un lvalue, et la valeur de retour d'une fonction n'est
| pas un lvalue.)

En C90, c'est formellement invalide et un diagnostic est requis.
Par contre c'est bien formé en C99.

| Mais je crois que C++ a le même problème. C'est donc qu'il n'y a
| pas de différence à cet égard.

Non, C++ n'a pas cette « subtilité. »

-- Gaby
Avatar
Gabriel Dos Reis
James Kanze writes:

[...]

| Tout à fait. Il a proposé une correction, mais je ne vois toujours
| pas comment l'appel de set_value est légal, même après sa
| correction.

Après la correction, c'est valide en C++, invalide en C90, et
undefined behaviour en C99.

-- Gaby