6. Lecture/écriture formatées et Fichiers. printf / scanf Fichier: Mémoire tampon Accès aux fichiers Modes d'ouverture Lecture / écriture



Documents pareils
Programmation système I Les entrées/sorties

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Programmation impérative

Les fichiers. Chapitre 4

Algorithmique et Programmation, IMA

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Rappels Entrées -Sorties

Le langage C. Séance n 4

Le système de gestion des fichiers, les entrées/sorties.

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Bases de programmation. Cours 5. Structurer les données

Les chaînes de caractères

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Introduction au langage C

Programmation en langage C

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Les structures de données. Rajae El Ouazzani

SUPPORT DE COURS. Langage C

GESTION DES FICHIERS C/UNIX

Programmation en langage C Eléments de syntaxe

Compression de Données - Algorithme de Huffman Document de Conception

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

INITIATION A LA PROGRAMMATION

Chap III : Les tableaux


EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Cours de Système : Gestion de Fichiers

Le prototype de la fonction main()

Cours de programmation avancée. Le langage C. Université du Luxembourg

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Cours 14 Les fichiers

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programmation système de commandes en C

URECA Initiation Matlab 2 Laurent Ott. Initiation Matlab 2

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Langage Éric Guérin 5 octobre 2010

COMPARAISONDESLANGAGESC, C++, JAVA ET

Chapitre 1 : La gestion dynamique de la mémoire

Initiation. àl algorithmique et à la programmation. en C

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Claude Delannoy. 3 e édition C++

Logiciel de base. Première année ENSIMAG

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Cours d Algorithmique et de Langage C v 3.0

BTS IRIS Cours et Travaux Pratiques. Programmation C. A. Lebret, TSIRIS, Lycée Diderot, 1995/06. en conformité avec le référentiel du BTS IRIS

TP : Gestion d une image au format PGM

UE Programmation Impérative Licence 2ème Année

Conventions d écriture et outils de mise au point

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Les structures. Chapitre 3

Programmation C. J.-F. Lalande. 15 novembre 2012

SYSTÈME DE GESTION DE FICHIERS

Structure fonctionnelle d un SGBD

Stockage du fichier dans une table mysql:

SYSTÈME DE GESTION DE FICHIERS SGF - DISQUE

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Programmation Classique en langage C

Cours Informatique 1. Monsieur SADOUNI Salheddine

Cours d initiation à la programmation en C++ Johann Cuenin

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Gestion des fichiers. Telecom-ParisTech BCI Informatique

Java Licence Professionnelle CISII,

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Introduction au Langage de Programmation C

Analyse de sécurité de logiciels système par typage statique

Programmation système en C/C++

Cours 6 : Tubes anonymes et nommés

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Pensez à vous inscrire... si ce n est pas encore fait

Cours de C/C++ par la pratique. Hugues Talbot

Le langage C. Introduction, guide de reference

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Plan du cours. Historique du langage Nouveautés de Java 7

COURS D'INFORMATIQUE: LANGAGE C NOTES DE COURS

Structure d un programme

I. Introduction aux fonctions : les fonctions standards

TD3: tableaux avancées, première classe et chaînes

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Flux de données Lecture/Ecriture Fichiers

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Le Langage C Licence Professionnelle Qualité Logiciel Pr. Mouad BEN MAMOUN ben_mamoun@fsr.ac.ma Année universitaire 2011/2012

UE C avancé cours 1: introduction et révisions

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Programmation C. Apprendre à développer des programmes simples dans le langage C

Travaux Dirigés n 1 : chaînes de caractères

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Logiciel de Base. I. Représentation des nombres

Support de Cours de Langage C. Christian Bac

Cours 1: Java et les objets

Transcription:

1 6. Lecture/écriture formatées et Fichiers printf / scanf Fichier: Mémoire tampon Accès aux fichiers Modes d'ouverture Lecture / écriture

2 Références Site du zèro : Programmer en C http://www.siteduzero.com/tutoriel-3-14189-apprenez-a-programmer-en-c.html Téléchargeable en PDF, bon complément au cours Plus facile d accès mais moins complet que le cours Cours de F. Fabre : http://www.ltam.lu/cours-c/ Remarque : les subtilités de scanf présentées ici peuvent vous aider en TP et ne serviront pas de questions pièges pour l examen.

Note: il doit y avoir autant de spécificateur que d expressions en paramètres 3 printf printf transfère du texte vers 1 fichier spécial : stdout, la sortie standard (par défaut l'écran) Prototype: int printf ( format, exp1, exp2, ); Valeur de retour: - nombre de caractères imprimés (sans le \0 si chaîne) -nombre négatif si erreur. format : une chaine de caractère comprenant -le texte à afficher tel quel à l écran ( \n : char pour newline) - les spécificateurs de format de conversion commençant par % pour les expressions exp1, exp2,

4 printf Spécificateur de format (conversion) : % + un caractère indiquant le format de conversion pour l affichage du contenu de la variable. %i, %d spécificateur un entier (int) affichage %u un entier non signé (unsigned int) %x en entier en hexadécimal %f, %e %lf, %le un réel (float) un réel long (double) %c un caractère (char) %s une chaîne de caractères (char[] ou char *) %s prend en argument l adresse de début (ou idem. le nom) de la chaîne. Le caractère nul de fin \0 n est pas imprimé.

5 printf Largeur du champ d impression et précision : %(largeur).(précision)symbol_conversion Exemples: q %10d : affiche au moins sur un espace de 10 caractères (ajoute des espaces blancs si nécessaire) q %.1f q %.5s : affiche le réel avec 1 seul chiffre derrière la virgule : affiche 5 caractères de la chaîne (ou moins si la chaîne est plus petite) q %12.5s : affiche 5 caractère et 8 blancs (car largeur de 12 caractères)

6 printf void main () { int i = 65, ret; double x = 34.06; char n[] = "je vais au bois"; ret = printf("%i %x %c \n", i,i,i); ret = printf("%lf %.1lf \n", x,x); Ø 65 41 A Ø 34.060000 34.1 } printf("code retour: %i\n", ret); printf("code retour: %8i\n", ret); ret=printf("%.5s %s\n", n,n); Ø code retour: 16 Ø code retour: 16 Ø je va je vais au bois

7 scanf scanf interprète un texte à partir d un 1 fichier spécial : stdin, l entrée standard (par défaut le clavier) puis mémorise les données reçues aux adresses indiquées Prototype: int scanf ( format, &exp1, &exp2, ); Valeur de retour: - le nombre de conversion avec succès (judicieux de le tester) format : une chaine de caractère précisant comment interpréter les données reçues à stocker aux adresses &exp1, &exp2,

8 scanf Spécificateur de format (conversion) : % + un caractère indiquant le format de conversion de la lecture. spécificateur lecture type argument associé %i, %d d un entier int * %x un entier en hexadécimal unsigned int* %f, %e un réel float * %lf, %le un réel long double* %c un caractère char* %s une chaîne de caractères char* ou char[] %s correspond à une chaîne de caractères sans espacement. L affectation stoppe au premier espace. La chaîne de caractère associée doit être assez grande pour ajouter le caractère de fin \0.

9 scanf Largeur du champ de lecture: %(largeur)symbol_conversion précise la largeur maximale du champ (le nombre de caractères) à évaluer pour la conversion Attention: le reste du champs reste dans le buffer du clavier et est attribué à la prochaine variable! Exemples: q %5d : n attribue à la variable entière que les 5 premiers chiffres lus! q %3f : n attribue au réel que les 3 premiers caractères lus (dont le., exemple: 2.3 pour 2.345) q %30s : n attribue à la chaine de caractères que 30 caractères au maximum

10 scanf : Caractères d espacement ( espace, nouvelle ligne ou tabulation) précisé dans le format: correspond à un ou plusieurs caractères d espacement quelconques dans la saisie. Exemples: int day, month, year; scanf( %i %i\n%i, &day, &month, &year); fonctionne correctement avec les saisies suivantes au clavier: 25 12 1978 ou encore 25 ou 12 25 12 1979 1978

11 scanf : Caractères d espacement: Note : un espacement à la fin du format est une mauvaise idée. scanf( %i ) ou scanf( %i \n ) Autres caractères : la saisie au clavier doit les reproduire exactement Exemples: int day, month, year; scanf( %i/%i/%i, &jour, &mois, &year); fonctionne correctement avec les saisies suivante au clavier: 25/12/1978 ou 25/012/01876 mais pas 25 12 1879 ou 25/ 12/1978

12 scanf : code de retour si le buffer du clavier est vide : attente de la validation d une nouvelle saisie avec la touche return ( ) sinon lecture. lecture progressivement du buffer du clavier et comparaison avec le format annoncé arrêt : -lorsque toutes les données précisées dans le format sont reconnues. -dès qu une donnée ne correspond pas au format annoncé (les dernières arguments reste alors non-initialisés) Le code de retour indique le nombre de conversions effectivement réalisées.

13 scanf void main () { } int j, x, ret; char t[10]; ret = scanf("%2i %i", &j, &x); printf("code: %i, lus: %i %i\n", ret, j, x); ret = scanf("%s", t); printf("code: %i, t: %s\n", ret, t); 23 3 mer code: 2, lus: 23 3 code: 1, toto (2scanf à la suite: le premier n a pas vidé le buffer) 234 6 mer code : 2, lus: 23 4 code : 1, t: 6 (%2i -> le 4 de 234 reste dans le buffer ) 23?3 mer code: 1, lus: 23 0 code: 1, t:?3 (erreur 1 er scanf)

14 getchar, puts et gets int getchar (); sans arguments - lire un caractère (même d espacement) dans le buffer du clavier int gets( char *s ); -lire une ligne (le buffer du clavier tant que le caractère \n n est pas rencontré) et stocker la ligne à l adresse de la chaîne. - \0 est ajouté par la fonction à la fin de la chaîne int puts( char *s ); -afficher la chaîne de caractère + un \n à l écran

15 getchar void main () { int j; scanf("%i", &j); 23? char? (ascii 63) (? après que le scanf lit 23) } /*get 1 char from keyboard after end of scanf*/ j = getchar(); printf("char %c (ascii %i)", j, j); 23 char (ascii 10 ) ( \n code ascii 10 : le scanf laisse le \n de la touche dans le buffer du clavier après sa lecture de l entier)

16 Fichiers 2 impératifs : stockage permanent de l'information stockage de grandes quantités d'information Fichiers : Ensembles structurés de données stockées sur un support externe (suite d'enregistrements) On peut distinguer 2 types de fichiers : texte : * organisé en lignes (séparées par '\n') * traduction 1 octet = 1 caractère * affichable sur écran binaire : * séquence d'octets les uns derrière les autres sans traduction * adapté au données hétérogènes et structures complexes * gain de place mais risque d'incompatibilité entre machines (sizeof)

17 Accès aux fichiers Accès disques sont très lents comparés aux accès mémoire Important de limiter les accès physiques "buffering" Mémoire tampon (buffer) est une zone de mémoire centrale où l'information est mémorisée temporairement programme buffer fichier Lecture / écriture (Possibilité de travailler "non bufférisé") Blocs (512 / 1024 cctets) L utilisation d un buffer est transparent pour l utilisateur et ne change rien à l accès.

18 Accès aux fichiers Fichier est repéré par un nom externe sur le médium (disque dur) (/home/morane/fichiers/myfile.dat) Comment relier les instructions d' I/O avec le nom externe? On passe par une structure de type FILE regroupe toutes les informations nécessaires au programme pour manipuler les données du fichier (voir <stdio.h>) Ø adresse de la mémoire tampon Ø position actuelle de la tête de lecture/écriture Ø type d'accès au fichier : lecture, écriture, Ø état du fichier Ø

19 Accès aux fichiers Une structure FILE doit être créée par fopen( ) lorsqu'on veut utiliser un fichier f = fopen( nom_fichier, mode_ouverture ) accepte en entrée un nom externe négocie avec le système une structure FILE initialise cette structure rend un pointeur sur cette structure (NULL si erreur d ouverture) Exemple : FILE *f ; f = fopen("truc.dat", "w") ; (déclaration) (ouverture) la commande fclose(f) annule cette liaison et ferme le fichier

20 Modes d ouverture des fichiers Mode d'ouverture Position après ouverture Si fichier déjà existant Si fichier non existant "r" lecture seule début erreur "w" écriture seul début écrasement! création "a" écriture seul fin erreur "r+" lecture/écriture début erreur "w+" lecture/écriture début écrasement! création "a+" lecture/écriture fin erreur

21 Nom du fichier Eviter les accents et espaces dans les noms de fichiers Chemin absolu : /home/etudiant/tp1/ex1.txt Chemin relatif (préférable) par rapport au répertoire ou est exécuté le programme : ex1.txt ou./ex1.txt pour un fichier dans le répertoire courant TP/ex1.txt ou./tp/ex1.txt pour un fichier dans sous-répertoire TP../ex1.txt pour un fichier dans le répertoire supérieur

22 Lecture / écriture séquentielle Tête de lecture l o i c \n 2 8 On ne peut lire ou écrire que sous la tête de lecture La tête de lecture avance après chaque lecture ou écriture sous la donnée suivante

23 Lecture / écriture en mode texte ligne par ligne caractère par caractère ligne par ligne avec (fichiers texte) int fprintf (file *F, format, expr1, expr2, ); Ecrit la chaîne de caractères dans le fichier F. Retourne le nombre de caractères écrits ou une valeur <0 si erreur Note: fprintf(stdout,..) est la même chose que printf int fscanf (file *F, format, &expr1, &expr2, ); Lit les données dans le fichier F et les stocke aux adresses indiquées. Retourne le nombre de données lues avec succès. Note: fscanf(stdin, ) est la même chose que scanf int feof(file *F) Renvoie une valeur différente de 0 si EOF (End Of File), la fin du fichier F, est atteinte.

24 Ecriture en mode texte int main() { FILE *F_out; char name[] = loic ; int age = 18, poids = 70; F_out=fopen( liste.txt, w ); if (F_out ==NULL) {printf( Erreur ); return(-2);} fprintf(f_out, %s %i %i\n, name, age, poids); fprintf(f_out, %s %i %i\n, eric, 56, 82); fclose(f_out); return(0); } Sort du programme si échec ouverture du fichier. liste.txt: loic 18 70 eric 56 82

25 Lecture en mode texte int main() { FILE *F_in; char name[]; int age, poids; F_in = fopen( liste.txt, r ); if (F_in == NULL) return(-2); while (!feof(f_in) ) { fscanf(f_in, %s %i %i\n, name, &age, &poids)); printf( %s %i %i\n, name, age, poids); } fclose(f_out); return(0); } liste.txt: loic 18 70 eric 56 82 Tant que la fin du fichier n est pas atteinte : lire et afficher le contenu Lecture du même format que celui écrit. > loic 18 70 > eric 56 82

26 Lecture / écriture en mode texte ligne par ligne caractère par caractère caractère par caractère (fichiers texte) int fputc (int c, file *F); Ecrit le caractère (0-255) dans le fichier F. Retourne le caractère écrit ou EOF si une erreur. int fgetc (file *F); Lit un caractère du fichier F. Retourne le caractère sous forme d un entier ou EOF à la fin du fichier. int feof(file *F)

27 Lecture en mode texte #include <stdio.h> int main() { FILE *F_in; char c; liste.txt: loic 18 70 eric 56 82 F_in=fopen("liste.txt","r"); if (F_in == NULL) {printf( erreur ); return(-2);} while ( (c=fgetc(f_in))!= EOF ) printf("%c", c); Tant que c (le caractère lu) est différent de EOF : } fclose(f_in); return(0); > loic 18 70 > eric 56 82

28 Lecture / écriture en mode binaire Efficace surtout pour les tableaux et les structures complexes Principales fonctions (fichiers binaires) int fwrite (type *bloc, int taille, int nombre, FILE *F); Ecrit nombre éléments de taille taille (octets) à partir de l'emplacement mémoire pointé par bloc dans le fichier F. Rend le nombre d éléments écrits. int fread (type *bloc, int taille, int nombre, FILE *F); Lit nombre éléments de taille taille (octets) dans le fichier F. Le résultat est stocké à l'emplacement pointé par bloc. Rend le nombre d'éléments lus (peut être <nombre ou 0 si eof) int feof (File *F);

29 Ecriture en mode texte #include <stdio.h> int main() { FILE *OUT; int tab[8] = {7,6,5,4,3,2,1,-1}; tableau.txt: (ouvert par un éditeur de texte) OUT = fopen("tableau.txt","w"); } if (OUT == NULL) {printf ("erreur"); return(-2);} fwrite(tab,8,sizeof(int),out); fclose(out); return(0); tableau.txt: (ouvert par un éditeur hexadécimal, + complément à 2) 07 00 00 00 06 00 00 00 05 00 00 00 04 00 00 00 03 00 00 00 02 00 00 00 01 00 00 00 FF FF FF FF

30 Lecture en mode texte int main() { FILE *IN; int i=0, n=10, *tab; tab=(int*)malloc(n*sizeof(int)); IN = fopen("tableau.txt","r"); /*ajouter test ouverture IN*/ tableau.txt: (ouvert par un éditeur hexadécimal, + complément à 2) 07 00 00 00 06 00 00 00 05 00 00 00 04 00 00 00 03 00 00 00 02 00 00 00 01 00 00 00 FF FF FF FF } while (!feof(in)) { fread(tab+i,1,sizeof(int),in); i++; } printf("tab[7]: %i",tab[7]); fclose(in); return(0); tab[7] = -1;