Question sur les fichiers - C - Programmation
Marsh Posté le 16-04-2010 à 11:25:37
http://www.cplusplus.com/reference [...] dio/fopen/
Citation : |
pour résumer : comparer fichier à NULL permet de vérifier si fopen a correctement ouvert le fichier, puisque cette fonction renvoie NULL en cas d'erreur à l'ouverture
Marsh Posté le 16-04-2010 à 11:28:13
Bonjour,
un pointeur est avant tout une zone mémoire qui contient une autre adresse comme valeur. C'est le contenu de cette zone qui est comparée a NULL.
Sinon lit la partie "valeur renvoyée" pour comprendre pourquoi on teste si fichier est différent de NULL: http://pwet.fr/man/linux/fonctions_bibliotheques/fopen
#edit: grilled!
Marsh Posté le 16-04-2010 à 11:50:13
lassault1 a écrit : Bonjour a tous
|
Tout a fait.
On fait une comparaison du type if(15263524 != NULL), quand la valeur de fichier est l'adresse 15263524.
En général, NULL, c'est une valeur qu'a un pointeur quand tout ne s'est pas bien passé (qu'il n'a pas été associé à quelque chose sur quoi pointer pour une raison ou une autre). Le test if (fichier != NULL) signifie grosso modo: si fichier est un pointeur valable, et qu'il y a pas eu de pb avec la structure sur laquelle il pointe.
A+,
Marsh Posté le 16-04-2010 à 13:05:47
Merci mais apparemment le poste de gilou et de breizhbugs sont contradictoire... j'ai compris les 2 postes mais lequel est juste??
Marsh Posté le 16-04-2010 à 13:16:16
lassault1 a écrit : Merci mais apparemment le poste de gilou et de breizhbugs sont contradictoire... j'ai compris les 2 postes mais lequel est juste?? |
Pas du tout,
Un pointeur est une variable dans laquelle on stocke une adresse mémoire. Dans le cas ou fopen() se passe bien, cette variable va contenir l'adresse de la structure FICHIER (donc fichier= 15263524 dans ton exemple), dans le cas ou cela se passe mal, elle contiendra NULL (donc fichier=0).
Marsh Posté le 16-04-2010 à 13:16:59
lassault1 a écrit : Merci mais apparemment le poste de gilou et de breizhbugs sont contradictoire... j'ai compris les 2 postes mais lequel est juste?? |
Ces deux messages ne me semblent pourtant pas contradictoires.
Marsh Posté le 16-04-2010 à 16:36:36
breizhbugs parce que tu disais " C'est le contenu de cette zone qui est comparée a NULL." et gilou "disait que c'est l'adresse qui est comparée a NULL"
Si j'ai bien compris on déclare *fichier = NULL
Si le fichier a été ouvert alors *fichier pointe sur FILE donc *fichier != NULL car *fichier contient une adresse..
C'est ça ?
Marsh Posté le 16-04-2010 à 18:55:06
Voila, c'est ça.
Le contenu d'une variable de type int, c'est un nombre entier.
Le contenu d'un pointeur, c'est une adresse vers une zone mémoire.
Donc, breizhbugs et gilou parlent bien de la même chose : le contenu du pointeur, c'est-à-dire l'adresse qu'il contient, est comparé à NULL.
Marsh Posté le 16-04-2010 à 19:11:00
Merci Elmoricq
Moi je pensé plutôt que :
fichier != NULL ( là on compare une adresse car fichier est un pointeur)
Et *fichier != NULL ( là on compare le contenu du pointeur car on a rajouté "*" )
Marsh Posté le 16-04-2010 à 20:01:14
De toute façon, en général, en C, on n'écrit pas:
if (fichier != NULL)
mais tout simplement
if (fichier)
Ce lien devrait t'intéresser: http://c-faq.com/null/index.html
Notes qu'en C, NULL n'est pas obligatoirement l'entier 0, ça peut parfois être défini comme (void *)0.
[tandis qu'en C++, NULL vaut toujours 0, par définition]
A+,
Marsh Posté le 16-04-2010 à 20:45:50
gilou a écrit : De toute façon, en général, en C, on n'écrit pas: |
C'est une affaire de style. Les deux s'écrivent, les deux ont des partisans qui luttent farouchement si on veut leur faire utiliser l'autre idiome.
Et ma perception est que leurs nombres sont approximativement égal.
Marsh Posté le 16-04-2010 à 21:14:25
Code :
|
est équivalent à
Code :
|
de même que
Code :
|
est équivalent à
Code :
|
Il faut savoir lire les deux formes même si certains réservent la forme implicite aux _Bool et aux entiers utilisés comme booléen.
Marsh Posté le 16-04-2010 à 22:34:54
Un Programmeur a écrit : |
Oui oui. Je pense qu'il y en a plus qui utilisent la tournure if (p) plutôt que if (p != NULL) si on se restreint juste au programmeurs C. Si on englobe ceux qui font du C++, ou des langages a syntaxe dérivée du C, on doit en avoir à peu près autant dans chaque camp en effet.
A+,
Marsh Posté le 17-04-2010 à 08:37:19
lassault1 a écrit : breizhbugs parce que tu disais " C'est le contenu de cette zone qui est comparée a NULL." et gilou "disait que c'est l'adresse qui est comparée a NULL" |
Il s'agit d'une synonymie. Les deux parlent bien du pointeur "fichier" (le contenu de la case qui se nomme "fichier" si tu préfères)
lassault1 a écrit : Merci Elmoricq |
Attention !!! *truc ne signifie pas "contenu de truc" mais "contenu de la case mémoire qui se trouve dans le contenu de truc"
Exemple: truc contient la valeur 0x1234
Tu demandes truc, tu demandes son contenu donc 0x1234
Tu demandes "*truc", tu demandes le contenu de ce qu'il y a à l'adresse 0x1234 !!!
gilou a écrit : Oui oui. Je pense qu'il y en a plus qui utilisent la tournure if (p) plutôt que if (p != NULL) si on se restreint juste au programmeurs C. Si on englobe ceux qui font du C++, ou des langages a syntaxe dérivée du C, on doit en avoir à peu près autant dans chaque camp en effet. |
Hey, vous avez aussi ceux qui se battent pour utiliser la syntaxe if(!fichier)
Marsh Posté le 18-04-2010 à 18:42:57
C'est vrai que if (fichier) est la même chose que if(fichier== 1) ??
Marsh Posté le 18-04-2010 à 18:46:57
Non, c'est la même chose que if (fichier != 0) et ça a été écrit ci-dessus. Je vais finir par me demander si tu lis et comprends les réponses qu'on te fait.
Marsh Posté le 18-04-2010 à 18:57:50
Oui j'ai lu..
if (fichier) n'est pas la même chose que if (fichier != 0) mais if (fichier != NULL) car fichier est un pointeur comme il est dit dans ton exemple ..
Marsh Posté le 18-04-2010 à 19:06:32
0 est une manière valide de donner un pointeur nul, et certains n'utilisent que celle-là.
En passant, if (fichier == 1) ne devrait pas compiler si fichier est un pointeur.
Marsh Posté le 18-04-2010 à 19:23:30
Ok merci..
Il y a un truc bête que je comprend pas..
Code :
Code :
|
Dans cette boucle, a la fin de l'instruction de la 1ere boucle i = 1 car il a été incrémenter, mais lorsqu'il fait la 2eme boucle il va lire i = 0. Alors pourquoi i = 1 ??
Marsh Posté le 18-04-2010 à 19:42:02
L'initialisation ne se fait qu'une fois. Donc c'est équivalent à
Code :
|
Marsh Posté le 16-04-2010 à 11:22:00
Bonjour a tous
Dans ce code on compare fichier != NULL or fichier est un pointeur, donc il a une adresse comme valeur, alors c'est comme si on fessait par exemple : if(15263524 != NULL) non ?