OVH Cloud OVH Cloud

trois petites questions

23 réponses
Avatar
pere.noel
La première question :

dans main(...) faut-il terminer pae return ou exit, je présume exit
EXIT_SUCCES|EXIT_FAILURE ???

La seconde question :

si un fichier est vide (ce qui peut-être "normal" (ie non pathologique)
le "file = fopen(file_name, "r");" retourne NULL ???

j'ai eu ce cas...

y a tt'il un moyen de vérifer la différence entre :

fichier non présent et fichier présent MAIS vide ???

dans le cas ou "file = fopen(file_name, "r");" retourne NULL, le
"fclose(file);" restet'il utile ou non ? (je pense que non...

La troisième question :

elle concerne les vars d'environnement.

avec getenv("HOME"); je peux attraper le HOME du USER, SHELL et TERM
aussi mais y a t'il un moyen de lister les vars d'env vues par C ???

par exemple existe-t'il un var donnant le séparateur "/" dans les pathes
de fichiers ???

c tout pour aujourd'hui )))

au fait, le K&R et nettement + lisible que le delannoy (bien nommé
àlanoix) ;-)

--
une bévue

10 réponses

1 2 3
Avatar
gl

dans le cas ou "file = fopen(file_name, "r");" retourne NULL, le
"fclose(file);" restet'il utile ou non ? (je pense que non...



fclose(NULL) n'est pas défini, il ne faut donc pas appeler fclose(file)
si file vaut NULL.

Avatar
Eric Levenez
Le 11/09/06 18:40, dans
<1hlij6m.18mll171fppjrgN%, « Une bévue »
a écrit :

Denis Leger wrote:

Oui, avec main :

int main(int argc, char * argv[], char * envp[])
{
...
}

dans envp, tu as toutes les variables d'environnement...


j'essaie asap...


C'est la seule méthode je crois qui soit portable.

ah merci beaucoup, je suppose quelles sont sous la forme :

MACHIN=bidule ???

j'ai essayé avec environ aussi :


Il manque plein de include. Quand tu postes du code, pense à copier tout
ton code et pas juste une partie, sinon ce n'est guère exploitable.

int main(void) {
extern char **environ;


"environ" n'est pas du C standard.

char **e;
char *key, *value;
for(e = environ ; *e != NULL ; e++) {
key = strtok(*e, "=");


Les variables d'environnement ne doivent pas être modifiées or strtok écrit
dedans. Cela peut très bien planter sur une autre machine.

value = strtok(NULL, "=");
printf("%s = %sn", key, value);
}
return EXIT_SUCCESS;
}

(d'après ce que m'a donné "Xavier Roche" plus haut dans ce fil :
<http://groups.google.fr/group/fr.comp.lang.c/msg/b8fe3dfe32303c32>)


Ce n'est pas du C standard. Utilise le troisième argument du main pour cela.

ext-ce qu'on peut toujours comptéer sur PWD ???


C'est quoi "PWD" ?

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.


Avatar
pere.noel
Eric Levenez wrote:

C'est la seule méthode je crois qui soit portable.

ah merci beaucoup, je suppose quelles sont sous la forme :

MACHIN=bidule ???

j'ai essayé avec environ aussi :


Il manque plein de include. Quand tu postes du code, pense à copier tout
ton code et pas juste une partie, sinon ce n'est guère exploitable.


OK


int main(void) {
extern char **environ;


"environ" n'est pas du C standard.



bon, j'adopterais ta solution...

char **e;
char *key, *value;
for(e = environ ; *e != NULL ; e++) {
key = strtok(*e, "=");


Les variables d'environnement ne doivent pas être modifiées or strtok écrit
dedans. Cela peut très bien planter sur une autre machine.


ah oui c'est passé par pointeur pointé...


value = strtok(NULL, "=");
printf("%s = %sn", key, value);
}
return EXIT_SUCCESS;
}

(d'après ce que m'a donné "Xavier Roche" plus haut dans ce fil :
<http://groups.google.fr/group/fr.comp.lang.c/msg/b8fe3dfe32303c32>)


Ce n'est pas du C standard. Utilise le troisième argument du main pour cela.

ext-ce qu'on peut toujours comptéer sur PWD ???


C'est quoi "PWD" ?


P = Path to
W = Working
D = Directory

càd là **** d'où **** est lancé le main par ex si au term, on fait :

~/work/C/essais/environ_by_main_arg%> ./test /* l'exec est test */
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--------PATH FROM HOME
PWD retourne le path depuis / vers le répertoire parant de test :
PWD = /Users/yvon/work/C/essais/environ_by_main_arg
OLDPWD = /Users/yvon/work/C/essais/environ


si je fais :

~%> cd /
^-------------------TILDA == HOME
/%> /Users/yvon/work/C/essais/environ_by_main_arg/test
^------------------- "/"

/* ici le test est lancé depuis / */

alors j'ai :

PWD = /
OLDPWD = /Users/yvon /* j'étais dans HOME avant le cd / */


--
une bévue


Avatar
pere.noel
gl wrote:


fclose(NULL) n'est pas défini, il ne faut donc pas appeler fclose(file)
si file vaut NULL.


OK, merci bien !
--
une bévue

Avatar
Eric Levenez
Le 11/09/06 19:40, dans
<1hlilwu.w7civr1qpfd3N%, « Une bévue »
a écrit :

Eric Levenez wrote:

C'est quoi "PWD" ?


P = Path to
W = Working
D = Directory


Ah, donc tu parle de "pwd" (en minuscule) qui est une commande shell unix,
et pas une fonction C. Et c'est "Print Working Directory". Certains Shell
utilisent une variables d'environnement PWD, mais qui ne sera pas toujours à
jour suivant les shells.

Le C n'a pas les notions de répertoire, donc pas de working directory en C.
par contre sous unix il y a les fonctions C : getwd et getcwd.

càd là **** d'où **** est lancé le main par ex si au term, on fait :


Disons, que c'est le répertoire courant du père du programme. Le père
pouvant changer de répertoire entre son lancement et l'exécution du fils.

De plus il peut ne pas y avoir de répertoire courant.

Exemple :
- tu te places dans un répertoire x par le shell
- tu lances un programme de test qui fait un "sleep" de quelques secondes
- tu effaces le répertoire x par un shell pendant ce temps
- le programme, après son sleep, affiche le répertoire courant : NULL car il
n'existe plus dans le système de fichier.

Mais c'est quoi ta question sur le C standard déjà ? :-)

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.


Avatar
pere.noel
Eric Levenez wrote:


Mais c'est quoi ta question sur le C standard déjà ? :-)


j'ai pas de question moi, que des réponses )))
--
une bévue

Avatar
gl
Le 11/09/06 18:40, dans
<1hlij6m.18mll171fppjrgN%, « Une bévue »

Denis Leger wrote:

Oui, avec main :

int main(int argc, char * argv[], char * envp[])
{
...
}

dans envp, tu as toutes les variables d'environnement...
j'essaie asap...



C'est la seule méthode je crois qui soit portable.




Malheureusement non, la norme ne définie que :
* int main(void)
* int main(int argc, char* argv[])
mais il est vrai que la forme avec envp est assez fréquente, mais pas
100% portable.



Avatar
Eric Levenez
Le 11/09/06 20:13, dans <4505a745$0$5084$, « gl »
a écrit :


C'est la seule méthode je crois qui soit portable.


Malheureusement non, la norme ne définie que :
* int main(void)
* int main(int argc, char* argv[])


Et :

int main(int argc, char *argv[], char *envp[])

C'est défini au paragraphe J.5.1 de la norme. Mais pour que cette fonction
soit portable il faut effectivement que le système le supporte :-)

mais il est vrai que la forme avec envp est assez fréquente, mais pas
100% portable.


--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.


Avatar
pere.noel
Eric Levenez wrote:

C'est défini au paragraphe J.5.1 de la norme. Mais pour que cette fonction
soit portable il faut effectivement que le système le supporte :-)


pas de pb pour moi, je cherche la portabilité (dans ce cas) entre Mac OS
X et Mac OS X )))
--
une bévue

Avatar
gl
Le 11/09/06 20:13, dans <4505a745$0$5084$, « gl »

C'est la seule méthode je crois qui soit portable.
Malheureusement non, la norme ne définie que :

* int main(void)
* int main(int argc, char* argv[])


Et :

int main(int argc, char *argv[], char *envp[])

C'est défini au paragraphe J.5.1 de la norme. Mais pour que cette fonction
soit portable il faut effectivement que le système le supporte :-)


Dans le paragraphe "Common extensions". Ce n'est pas une forme
normalisée et imposée par la norme mais une extension courante (comme
indiqué dans mon message précédent).
Une implémentation est libre ne pas la proposer voire de proposer une
extension syntaxiquement semblable avec un sens totalement différent (ce
qui serait particulièrement malvenu).

Ce n'est pas 100% portable même si il est vrai qu'il y a de fortes
chances de rencontrer cette extension, qui reste malgré tout la
meilleure des solutions (dans les cas où getenv() ne convient pas bien
entendu).



1 2 3