Ouverture de fichiers et fonctions [Résolu] - C - Programmation
Marsh Posté le 19-05-2009 à 17:49:49
Contexte : je souhaite ouvrir un fichier, le copier dans un buffer et afficher ce buffer sur la console.
Pour cela voici le main ()
Code :
|
Fonctions:
Le problème n'existerai pas si j'utiliserais fopen() directement dans affiche_fichier(...), je souhaite comprendre pourquoi le prog plante...
Edit: effectivement pour fopen, c'est corrigé mais cette erreur n'est pas à l'origine du plantage.
Marsh Posté le 19-05-2009 à 19:32:20
Edit: Ouah, j'ai cliqué sur éditer au lieu de répondre (et sur le mauvais message en plus).
Bah, chais pas ce que tu fais. Mais le programme suivant, récupérer de ton lien et corriger de deux ou trois erreurs, marche_chez_moi™ (WinXP, mais il n'y aucune raison que ça marche par ailleurs):
Bref, défini ce que tu appelles "plantage". Vois-tu un SIGSEGV ou SIGTRAP en lançant le programme dans un debugger ? Arrêt brutal au milieu du code ? Si tu as valgrind, y a t-il des warnings particuliers ?
Code :
|
Marsh Posté le 19-05-2009 à 20:02:59
J'ai rajouté exit au dernier moment, ce n'est pas la cause du plantage, commentez le pour voir.
Pour fopen, oui il y a une erreur dans le 2eme argument mais ce n'est pas la cause du plantage. (Cf. post précédent.)
De toute façon, le fichier à ouvrir existe et le programme fonctionne parfaitement en utilisant fopen() au sein de affiche_fichier().
C'est le passage de fopen (et de la déclaration de FILE * fichier dans une fonction a part (ouvrir_fichier()) qui pose problème.
Je ré-explique le problème :
En considérant ces deux énoncés est-il possible d'appeler un pointeur en dehors de son bloc sans utiliser de variables globales.
Dans ce cas là pouvez-vous m'expliquer le fonctionnement de fonctions qui créent et renvoient un pointeur (fopen, fgets, ...).
Marsh Posté le 19-05-2009 à 20:16:58
kheel a écrit :
|
Oui... mais le pointeur pointe (d'où son nom) vers une zone mémoire accessible de partout (sauf si t'as commis l'erreur de le faire pointer vers une autre variable locale)
kheel a écrit : En considérant ces deux énoncés est-il possible d'appeler un pointeur en dehors de son bloc sans utiliser de variables globales. |
Le pointeur non. La variable qui stockait l'adresse a disparu. Mais si cette adresse est stockée dans une seconde variable (ou renvoyée par la fonction), tu peux toujours aller toper ce qui est pointé car ça, ça n'a pas disparu !!!
Un exemple tout simple
Code :
|
L'exemple inverse... mais qui foire
Code :
|
Le 3° comme le 2° mais qui fonctionne
Code :
|
kheel a écrit : Dans ce cas là pouvez-vous m'expliquer le fonctionnement de fonctions qui créent et renvoient un pointeur (fopen, fgets, ...). |
1) quand tu fais fp=fopen("...", "r/w/a" )
a) la fonction commence par allouer une zone mémoire suffisante pour y stocker les outils de manipulation du fichier
b) la fonction y stocke lesdits outils. On pourra y trouver par exemple l'endroit du fichier où tu te trouves, la taille du fichier, le mode d'accès (r/w), bref divers outils quoi
c) la fonction te renvoie l'adresse de cette zone mémoire (qui se trouve dans la mémoire du programme donc accessible de partout)
2) quand tu fais du fgets(..., ..., fp) => la fonction fgets() récupère cette zone mémoire donc peut aller utiliser les outils qui y sont pour lire le fichier et te renvoyer les data
3) quand tu fais fclose(fp) => la fonction fclose libère la zone mémoire
Marsh Posté le 19-05-2009 à 22:54:35
Merci de m'avoir éclaircit sur ces points.
Effectivement la déclaration d'un pointeur restait locale au bloc en cours mais la zone allouée reste disponible globalement, pour peu qu'on ai son adresse.
Problème résolu.
Marsh Posté le 19-05-2009 à 16:03:53
Bonjour,
cette situation traine dans ma tête depuis trop longtemps, sans succès je n'ai pu la résoudre.
Je souhaite ouvrir un fichier et dédier une fonction à l'ouverture de ce fichier.
On balance l'emplacement du fichier dans la fonction et celle ci s'occupe d'ouvrir le fichier.
On reste simple, on considère qu'il existe et qu'il contient des données, l'emplacement est valable aussi.
Donc :
Cette fonction sera donc appelée à chaque fois que je souhaite ouvrir un fichier.
(Je souhaite déclarer un pointeur localement puis agrandir sa portée)
A l'exécution, des erreurs de violation d'accès sont signalés.
Il y a effectivement un problème de portée du pointeur fichier.
Les mots clés extern ou static peuvent-ils venir à mon aide???
Message édité par kheel le 19-05-2009 à 22:55:04