• - : la donnée convertie est cadrée à gauche
• + : si la donnée est positive le signe + est mis
• blanc : si le résultat de la conversion ne commence pas par un signe, un blanc est ajouté
• 0 : remplissage avec des 0 devant plutot que des blancs
• ’ : pour les conversions décimales groupement des chiffres par 3
• # :
• pour format o augmente la précision de manière à forcer un 0 devant la donnée
• pour format x et X force 0x devant la donnée
• pour format e, E, f, g, et G force le point décimal
• pour format g et G les zéros après le point décimal sont conservés
•
Nous avons déjà étudié les deux fonctions d ’ entrées-sorties standards formatées qui sont :
• int printf(const char *format, ...) ;
• int scanf(const char *format, ...) ;
• int sprintf(char *string, const char *format, ...) ;
• conversion de données en mémoire par transformation en chaîne de caractères.
• arguments :
• zone dans laquelle les caractères sont stockés ;
• format d’écriture des données ;
• valeurs des données.
• retour :
• nombre de caractères stockés.
• sprintf() convertit les arguments arg1, . . ., argn suivant le format de contrôle et met le résultat dans string(chaîne de caractères).
• int sscanf(char *string, const char *format, ...) ;
• lecture formatée à partir d’une zone mémoire.
• arguments :
• zone dans laquelle les caractères sont acquis ;
• format de lecture des données ;
• adresse des variables à affecter à partir des données.
• retour :
• nombre de variables saisies.
• conditions d’erreur :
• la valeur EOF est retournée en cas d’erreur empêchant toute lecture.
• Inversement, sscanf extrait d’une chaîne de caractères des valeurs qui sont stockées dans des variables suivant le format de contrôle.
• Deux fonctions fprintf et fscanf permettent de réaliser le même travail que printf et scanf sur des fichiers ouverts en mode texte
• int fprintf(FILE *,const char *,...);
• écriture formatée sur un fichier ouvert en mode texte.
• arguments :
• référence vers la structure décrivant le fichier ouvert dans lequel les caractères sont rangés ;
• format d'écriture des données ;
• valeurs des données.
• retour :
• nombre de caractères écrits.
• conditions d'erreur :
• une valeur négative est retournée en cas d'erreur d'écriture.
•
int fscanf(FILE *,const char *,...);
• lecture formatée dans un fichier ouvert en mode texte.
• arguments :
• référence vers la structure décrivant le fichier ouvert dans lequel les caractères sont lus ;
• format de lecture des données ;
• adresse des variables à affecter à partir des données.
• retour :
• nombre de variables saisies.
• conditions d'erreur :
• la valeur EOF est retournée en cas d'appel sur un fichier standard d'entrée fermé.
numéros d'utilisateur et de groupe, en mettant ces numéros dans des variables de type entier.
• Rappelons qu'une ligne de ce fichier contient les champs suivants séparés par le caractère deux points ':'.
• le nom de l'utilisateur,
• le mot de passe (crypté),
• le numéro d'utilisateur,
• le numéro de groupe dans lequel l'utilisateur est placé à la connexion,
• un champ servant à mettre des informations complémentaires appelé champ GCOS (ce champ peut contenir des caractères blancs) ;
• le répertoire de connexion de l'utilisateur,
• le fichier binaire exécutable à charger lors de la connexion (le plus souvent un shell).
FILE *pwf;
int i, res;
char nom[10], passwd[16], gcos[128], rep[255], shell[255];
int uid, gid;
pwf = fopen ("passwd", "r");
if (pwf == NULL){
printf ("Impossible d ouvrir le fichier %s \n", "/etc/passwd");
return 1;
if (res == ':'){
•
Jusqu ’ à maintenant nous avons vu des fonctions qui modifient de manière automatique le pointeur courant dans le fichier correspondant (adresse de l ’ octet dans le fichier à partir duquel se fait la prochaine opération
d ’ entrée-sortie). Nous allons voir les fonctions qui permettent de connaitre la valeur de cette position courante dans le fichier et de la modifier.
•
Ces fonctions associées à la position dans le fichier sont :
fseek, ftell, fgetpos, fsetpos, rewind.
• change la position courante dans le fichier.
• arguments :
• référence vers la structure décrivant le fichier ouvert ;
• déplacement à l’intérieur du fichier en nombre d’octets ;
• point de départ du déplacement. Cet argument peut prendre les valeurs suivantes qui selon la norme doivent être définies dans le fichier < stdio.h
> mais sont souvent dans le fichier < unistd.h > sur les machines de type
"UNIX system V" :
• SEEK_SET : le déplacement est relatif au début du fichier ;
• SEEK_CUR : le déplacement est relatif à la position courante ;
• SEEK_END : le déplacement est relatif à la fin du fichier ;
• retour :
• 0 en cas de succès
• conditions d’erreur :
• une valeur différente de zéro est retournée si le déplacement ne peut pas être réalisé.
• long ftell(FILE *) ;
• retourne la valeur de la position courante dans le fichier.
• argument :
• référence vers la structure décrivant le fichier ouvert ;
• retour :
• sur les fichiers binaires : nombre d’octets entre la position courante et le début du fichier.
• sur les fichiers texte : une valeur permettant à fseek() de repositionner le pointeur courant à l’endroit actuel.
• conditions d’erreur :
• la valeur -1L est retournée, et la variable errno est modifiée .
•
int fgetpos(FILE *, fpos_t *) ;
• acquiert la position courante dans le fichier.
• arguments :
• référence vers la structure décrivant le fichier ouvert ;
• référence d’une zone permettant de conserver la position courante du fichier (le type fpos_t est souvent un type équivalent du type entier long) ;
• retour :
• 0 en cas de succès
• conditions d’erreur :
• une valeur différente de 0 est retournée, et la variable errno est modifiée .
•
int fsetpos(FILE *, const fpos_t *) ;
• change la position courante dans le fichier.
• arguments :
• référence vers la structure décrivant le fichier ouvert ;
• référence d’une zone ayant servi à conserver la position courante du fichier par un appel précédent à fgetpos() ;
• retour :
• 0 en cas de succès
• conditions d’erreur :
• une valeur différente de 0 est retournée, et la variable errno est modifiée .
•
void rewind(FILE *) ;
• si la référence vers la structure décrivant le fichier ouvert fp est valide cette fonction est équivalente à (void)fseek(fp,0L,0).
•
Pour illustrer le déplacement à l ’ intérieur d ’ un fichier, nous allons prendre pour exemple la modification de l ’ âge des voitures dans le fichier FicParcAuto vu
précédemment.
•
Pour réaliser la modification d ’ un enregistrement dans un fichier on procède de la manière suivante :
• lire un enregistrement du fichier dans une zone en mémoire ;
• modifier la zone en mémoire ;
• replacer le pointeur courant du fichier sur le début de
l’enregistrement pour pouvoir réécrire cet enregistrement ;
• écrire la zone mémoire dans le fichier.
#include <stddef.h>
struct automobile { int age;
char couleur[20], numero[10], type[10], marque[10];
} uneauto;
int main (int argc, char *argv[]) { FILE *fparc;
int i;
size_t fait;
fparc = fopen ("FicParcAuto", "r+b");
if (fparc == NULL){
printf ("Impossible d ouvrir le fichier FicParcAuto \n");
return 1;
}
fait = fread (&uneauto, sizeof uneauto, 1, fparc);
•
Cet exemple peut aussi être réalisé avec fgetpos() et fsetpos().
•