Memento sur les fichiers et exemples ------------------------------------ Pour plus de details utiliser: man - Principales utilisations en mode texte : FILE * fopen(char *nom, char *mode) : ouverture de fichier en mode = "r" (lecture), "w" (creation) ou "a" (allongement) fclose(FILE *fp) : fermeture de fichier int feof(FILE *fp) : test de fin de lecture de fichier char getc(FILE *fp) : lecture d'un caractere char putc(char c, FILE *fp) : ecriture d'un caractere fscanf(FILE *fp, char *format, ...) : lecture formatee texte de donnees (memes formats que scanf) fprintf(FILE *fp, char *format, ...) : ecriture formatee texte de donnees (memes formats que printf) fgets(char *s, int taille, FILE *fp) : lecture de ligne dans la chaine de caracteres s fputs(char *s, FILE *fp) : ecriture de la chaine s Remarques: scanf(format, ...) <=> fscanf(stdin, format, ...) printf(format, ...) <=> fprintf(stdout, format, ...) - Principales utilisations en mode binaire : fopen : idem avec mode = "wb" (creation), "rb" (lecture), "rb+" (lecture/ecriture) fclose, feof : idem int fread(void *pt, int taille, int nb, FILE *fp) : lecture de objets de octets et rangement memoire en pt int fwrite(void *pt, int taille, int nb, FILE *fp) : ecriture int fseek(FILE *fp, long deplacement, int origine) : acces direct du curseur de lecture en origine = SEEK_SET (debut), SEEK_CUR (position courante), SEEK_END (fin) int ftell(FILE *fp) : retourne la position courante dans le fichier fp /*****************************************************************************/ /* Programme accessib.c teste si le fichier passe en argument du main est accessible en lecture */ /*****************************************************************************/ #include main (int argc, char *argv[]) { FILE * fp; fp = fopen(argv[1],"r"); if (fp==NULL) printf("%s inaccessible",argv[1]); else { printf("%s accessible",argv[1]); fclose(fp); } } /*****************************************************************************/ /* Programme copie.c cas general: copie f1 dans f2 (noms de fichiers en parametres du main) cas 1: 1 seul fichier en parametre <=> affiche f1 (f2=stdout) cas 2: aucun fichier en parametre <=> re-affiche l'entree standard (f1 = stdin, f2 = stdout) */ /*****************************************************************************/ #include /* f1 ouvert en lecture, f2 en ecriture */ void copie (FILE *f1, FILE *f2) { char c; c = getc(f1); while(!feof(f1)) {putc(c,f2); c=getc(f1);} } main (int argc, char *argv[]) { /* ajouter les controles d'acces sur fichiers ... */ if (argc==1) copie(stdin,stdout); /* cas 2 */ else { FILE *f1; f1=fopen(argv[1],"r"); if (argc==2) copie(f1,stdout); /* cas 1 */ else { FILE *f2; f2=fopen(argv[2],"w"); /* cas general */ copie(f1,f2); fclose(f2);} fclose(f1);} } /*****************************************************************************/ /* Programme somvec.c effectue la somme vectorielle de 2 grands vecteurs de reels ranges dans des fichiers textes (1er et 2eme arguments du main). Resultat dans un fichier texte (3eme argument du main). */ /*****************************************************************************/ #include /* ajouter les controles ...*/ main (int argc, char *argv[]) { FILE *f1, *f2, *f3; /* f1 + f2 dans f3 */ float v1, v2; /* suite de valeurs de f1 et f2 */ f1 = fopen(argv[1],"r"); f2 = fopen(argv[2],"r"); f3 = fopen(argv[3],"w"); fscanf(f1,"%f",&v1); fscanf(f2,"%f",&v2); while (!feof(f1) && !feof(f2)) { fprintf(f3,"%f",v1+v2); fscanf(f1,"%f",&v1); fscanf(f2,"%f",&v2);} if (!feof(f1)) printf("fichier %s trop long", argv[1]); else if(!feof(f2)) printf("fichier %s trop long", argv[2]); fclose(f1); fclose(f2); fclose(f3); } /*****************************************************************************/ /* Les programmes suivants traitent de fichiers binaires a acces direct. On considere des fichiers d'utilisateurs decrits par leur nom et le nombre de connexions effectuees sur un systeme (cf la structure USER). */ /*****************************************************************************/ /*****************************************************************************/ /* Programme config.c cree un fichier binaire (1er parametre du main) de structures USER - cas 1: interactivement (stdin) - cas 2: a partir d'un fichier texte (2eme parametre) en fournissant une suite de (chaine) (int) */ /*****************************************************************************/ #include typedef struct { char nom[30]; int connexions;} USER; /* users = fichier binaire de USER resultat, ouvert en ecriture config = fichier texte origine, ouvert en lecture */ void creer (FILE *users, FILE *config) { USER user; fscanf (config,"%s%d",user.nom,&user.connexions); while (!feof (config)) { fwrite(&user,sizeof(USER),1,users); fscanf (config,"%s%d",user.nom,&user.connexions); } } main (int argc, char *argv[]) { FILE * users; users = fopen(argv[1],"wb"); if (users == NULL) printf("erreur sur fichier %s", argv[1]); if (argc == 2) creer(users,stdin); /* cas 1 */ else { FILE * ftexte; ftexte = fopen(argv[2],"r"); /* cas 2 */ if (ftexte == NULL) printf("erreur sur fichier %s", argv[2]); else { creer(users,ftexte); fclose(ftexte);} } fclose(users); } /*****************************************************************************/ /* Programme etat.c affiche l'etat d'un fichier binaire tel que cree precedemment et dont le nom est passe en parametre du main */ /*****************************************************************************/ #include typedef struct { char nom[30]; int connexions;} USER; main (int argc, char *argv[]) { FILE *users; USER user; users = fopen(argv[1],"rb"); fread(&user,sizeof(USER),1,users); while(!feof(users)) { printf("%s\n%d\n",user.nom,user.connexions); fread(&user,sizeof(USER),1,users);} fclose(users); } /******************************************************************************/ /* Programme connect.c incremente les compteurs de connexions des utilisateurs dans le fichier binaire passe en 1er parametre du main - cas 1: interactivement (stdin) - cas 2: a partir d'un fichier texte (2eme parametre) Les utilisateurs sont designes par un numero correspondant a leur ordre de rangement dans le fichier binaire. Exemple: la suite de numeros d'utilisateurs donnee soit au clavier (cas 1) soit dans un fichier (cas 2): 3 1 3 0 ... incremente le compteur de l'utilisateur range a la position 3, puis de celui range en 1, 3 a nouveau, puis celui en 1ere position (0), ... */ /*****************************************************************************/ #include typedef struct { char nom[30]; int connexions;} USER; /* users = fichier binaire d'utilisateurs ouvert en lecture lit le i'eme USER du fichier et le range en ptuser */ void lire_ieme (FILE *users, int i, USER *ptuser) { fseek(users,i*sizeof(USER),SEEK_SET); fread(ptuser,sizeof(USER),1,users); } /* users = fichier binaire d'utilisateurs ouvert en ecriture range user en i'eme position dans le fichier */ void ecrire_ieme (FILE *users, int i, USER user) { fseek(users,i*sizeof(USER),SEEK_SET); fwrite(&user,sizeof(USER),1,users); } /* users = fichier binaire d'utilisateurs ouvert en lecture/ecriture connexions = suite des numeros d'utilisateurs (fichier texte en parametre (cas 2) ou stdin (cas 1), cf main) */ void connect(FILE *users, FILE *connexions) { int n; /*le numero de user dans le fichier users*/ USER user; fscanf(connexions,"%d",&n); while(!feof(connexions)) { lire_ieme(users,n,&user); user.connexions = user.connexions+1; ecrire_ieme(users,n,user); /* connexion suivante */ fscanf(connexions,"%d",&n);} } main (int argc, char *argv[]) { FILE *users; users = fopen(argv[1],"rb+"); if (users == NULL) printf("erreur sur fichier %s", argv[1]); else if (argc == 2) connect(users,stdin); /* cas 1 */ else { FILE *connexions; connexions = fopen(argv[2],"r"); /* cas 2 */ if (connexions == NULL) printf("erreur sur fichier %s", argv[2]); else connect(users,connexions); fclose(connexions); } fclose(users); }