Comment acceder un fichier en C

Comment acceder un fichier en C - C - Programmation

Marsh Posté le 30-11-2005 à 14:55:53    

Bonjour je voudrais savoir comment on accede à un fichier en C.
En fait, je voudrais faire un ptit prog qui me permet de gerer des personnes et qui me demande le nom de la personne, prenom etc, puis qui range ces données dans un fichier.
Puis quand je lui demande de m'afficher la liste des personnes, il va les rechercher dans le fichier...
C'est possible? comment on fait???

Reply

Marsh Posté le 30-11-2005 à 14:55:53   

Reply

Marsh Posté le 30-11-2005 à 14:57:49    

fopen(), fclose(), fputs(), fgets(), fprintf(), fwrite(), fread(), ...
 
Tu trouves tout ça dans stdio.h

Reply

Marsh Posté le 30-11-2005 à 15:16:31    


 
- Tu déclares un pointeur de type "FILE *" => FILE *fp
- Tu copie dans ce pointeur le résultat d'un "fopen" sur ton fichier =>  

  • pour écrire en réinitialisant le fichier: fp=fopen("mon_fichier", "w" )
  • pour lire: fp=fopen("mon_fichier", "r" )
  • pour ajouter à la fin: fp=fopen("mon_fichier", "a" )
  • pour écrire en réinitialisant le fichier ET le relire dans la foulée : fp=fopen("mon_fichier", "w+" )
  • pour lire ET écrire: fp=fopen("mon_fichier", "r+" )
  • pour ajouter à la fin ET le relire: fp=fopen("mon_fichier", "a+" )

+ mode "b" sur chaque mode précédent si ton fichier est binaire => fp=fopen("mon_fichier", "r+b" ) par exemple
 
- Tu utilises ensuite ton pointeur pour chaque fonction de lecture ou d'écriture que tu décides d'utiliser => Pour écrire 'Hello World" dans ton fichier préalablement ouvert en mode "w", "w+", "a", "a+" ou "r+" (ou tous ces modes précédents + "b" ) => fputs("Hello World", fp);
 
Une fois que t'as plus besoin d'accéder à ton fichier, tu passes ton pointeur à la fonction "fclose" => fclose(fp);
 
Bien entendu, toujours vérifier si le retour de "fopen" est nul car cela signifie que ton programme n'a pas réussi à ouvrir le fichier => cas à gérer

fp=fopen("zogloto", "w" );
if (fp == NULL)
{
    // Impossible d'ouvrir "zogloto" pour y écrire - Traitement de ce cas particulier
    ...
    ...
    // Souvent c'est inutile de continuer le travail
    return ...;    
}
 
// Travail sur zogloto
fputc(..., fp);
fputs(..., fp);
...
...
 
// Fermeture zogloto
fclose(fp);


Message édité par Sve@r le 30-11-2005 à 15:27:30

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-12-2005 à 15:08:30    

Et tiens, au fait, si je veux lire un fichier et le rentrer dans un tableau
à deux dimension x et y comment je fais pour le remplir de manière
à ce que chaque case contienne un caractère (un chiffre dans mon cas)
et faire que l'algo soit intelligente (qu'elle puisse s'adapter à la taille du tableau,
en ayant par exemple dans le fichier une saisie formatté avec des retours
à la ligne) ?

Message cité 1 fois
Message édité par guguy le 04-12-2005 à 15:09:41
Reply

Marsh Posté le 04-12-2005 à 18:10:58    

guguy a écrit :

Et tiens, au fait, si je veux lire un fichier et le rentrer dans un tableau
à deux dimension x et y comment je fais pour le remplir de manière
à ce que chaque case contienne un caractère (un chiffre dans mon cas)
et faire que l'algo soit intelligente (qu'elle puisse s'adapter à la taille du tableau,
en ayant par exemple dans le fichier une saisie formatté avec des retours
à la ligne) ?


J'ajoute malloc() / realloc() / free() pour la gestion dynamique de la mémoire, et tu as les éléments en main.
 
Ceci dit, si tu sais à peine comment gérer un fichier, je te vois mal démarrer sur une application complètement dynamique. Ca va faire trop de concepts à maitriser d'un coup.
 
Commence par des fichiers simples et des tableaux de tailles fixes. Surveiller la taille de façon à ne pas déborder. Surveiller aussi la fin de lecture.  
 
Poste ton code si tu a des problèmes.
 
Rappel, ici, on ne fait pas le boulot des autres... c'est à toi de fournir l'effort...


Message édité par Emmanuel Delahaye le 04-12-2005 à 18:13:08

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-12-2005 à 19:50:25    

A vrai dire je sais correctement gerer l'allocation dynamique de mémoire,
ce n'est pas ca mon problème.
 
C'est vrai que j'ai mal posé ma question, elle est en fait trés simplifiable,
est-ce que on peut détecter un passage à la ligne dans un fichier  
(équivalent à un '\n' donc) pour pouvoir donner au programme la taille
qu'il faudra allouer au tableau ?

Message cité 1 fois
Message édité par guguy le 04-12-2005 à 19:50:54
Reply

Marsh Posté le 04-12-2005 à 20:17:26    

guguy a écrit :

C'est vrai que j'ai mal posé ma question, elle est en fait trés simplifiable,
est-ce que on peut détecter un passage à la ligne dans un fichier  
(équivalent à un '\n' donc) pour pouvoir donner au programme la taille
qu'il faudra allouer au tableau ?


On peut compter les lignes en lisant avec fgetc() et en comptant les '\n'. Attention à la dernière si elle n'est pas terminée par un \n.
 
Ensuite, fgets() permet de lire des lignes. On teste la présence du '\n' pour savoir is la ligne a été lue complètement, sinon, on agrandi (realloc()) et on lis la suite (au bon endroit évidemment, il y a un piège...)
 
On peut aussi réallouer le tableau de lignes en fonction de la demande...
 
Il y a plusieurs possibilités plus ou moins simples...


Message édité par Emmanuel Delahaye le 04-12-2005 à 21:04:05

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-12-2005 à 21:15:53    

Oki, je viens de jetter un oeil dans des sources c++ que j'avais codé il
y a un bail et je suis tombé sur un bout de code qui comptait les lignes
et j'utilisais ifstream pour ouvrir le fichier et getline me servait à compter
les lignes (et j'ai à peine à le modifier pour qu'il me donne la taille de
la plus grande ligne).
 
Mais est-ce que ces instructions existent en C ?

Reply

Marsh Posté le 04-12-2005 à 21:21:34    

non

Reply

Marsh Posté le 04-12-2005 à 21:51:11    

Il y a malgrès tout une fonction getline() dans de nombreuses versions de la libc (dont la glibc).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed