TP7 : Fichiers. Programmation en C (LC4) Semaine du 10 mars 2007

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

Programmation impérative

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

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

Programmation système de commandes en C

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)

Les fichiers. Chapitre 4

Introduction au langage C

GESTION DES FICHIERS C/UNIX

Le langage C. Séance n 4

Programmation système en C/C++

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

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

Algorithmique et Programmation, IMA

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

3IS - Système d'exploitation linux - Programmation système

Le prototype de la fonction main()

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

Java Licence Professionnelle CISII,

Cours 14 Les fichiers

Programmation en langage C Eléments de syntaxe

Les structures. Chapitre 3

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

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


Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Programmation en langage C

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

Cours Programmation Système

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

1 Lecture de fichiers

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Flux de données Lecture/Ecriture Fichiers

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

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

Stockage du fichier dans une table mysql:

SUPPORT DE COURS. Langage C

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

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

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

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

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

Arguments d un programme

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

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

Rappels Entrées -Sorties

Programmation Classique en langage C

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

Cours de Système : Gestion de Fichiers

Simulation d un système de paiement par carte bancaire

Projet de programmation (IK3) : TP n 1 Correction

LEs processus coopèrent souvent pour traiter un même problème. Ces

Les processus légers : threads. Système L3, /31

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

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

TP : Gestion d une image au format PGM

Cours Langage C/C++ Programmation modulaire

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

Cours 6 : Tubes anonymes et nommés

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Programmation C++ (débutant)/instructions for, while et do...while

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

ACTIVITÉ DE PROGRAMMATION

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

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

Outils pour la pratique

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

Gestion des fichiers. Telecom-ParisTech BCI Informatique

OS Réseaux et Programmation Système - C5

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

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

AWS avancé. Surveiller votre utilisation d EC2

Programmer en JAVA. par Tama

Premiers Pas en Programmation Objet : les Classes et les Objets

Architecture des ordinateurs

Conventions d écriture et outils de mise au point

TP2 : tableaux dynamiques et listes chaînées

1.6- Génération de nombres aléatoires

Cours 1 : Qu est-ce que la programmation?

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

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

as Architecture des Systèmes d Information

Cours d Algorithmique et de Langage C v 3.0

COMPARAISONDESLANGAGESC, C++, JAVA ET

Les chaînes de caractères

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

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

Initiation à la programmation en Python

Gestion distribuée (par sockets) de banque en Java

INFO-F-404 : Techniques avancées de systèmes d exploitation

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

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

Programme Compte bancaire (code)

Chapitre 1 : La gestion dynamique de la mémoire

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Cours 1: Java et les objets

Transcription:

TP7 : Fichiers Programmation en C (LC4) Semaine du 10 mars 2007 1 Fichiers : les bases Afin de pouvoir stocker des données, ou d exploiter des données déjà existantes, il est indispensable de pouvoir manipuler des fichiers. C est ce que nous allons voir dans ce TP. 1.1 La syntaxe : ouverture et fermeture Pour toutes les opérations sur les fichiers, il faut inclure le header stdio.h (c est à dire mettre un #include<stdio.h> au début du programme). Un fichier s identifie par son nom. À partir du nom d un fichier, on peut ouvrir un «canal» permettant de lire ou écrire dans ce fichier. Le type de ces canaux est nommé FILE. Il s agit d un type «abstrait», dont la définition dépend fortement du système. On ne doit donc pas chercher à regarder à l intérieur, mais simplement appeler dessus les fonctions standards décrites ci-dessous. Ces fonctions travaillent en fait toutes avec des FILE *. Pour ouvrir un canal vers un fichier, on utilise la fonction FILE * fopen(char * nom_de_fichier, char * mode). Le mode sert à spécifier quelle sorte de canal l on veut. On utilisera le mode «écriture», dénommé par la chaine "w" et le mode «lecture», dénommé par la chaine "r". Ainsi les lignes : FILE f 1 ; f 1 = fopen ( blop, r ) ; ouvrent le fichier blop en lecture. Le fichier doit exister si on cherche à le lire, par contre, si on l ouvre en mode écriture et qu il n existe pas, il sera créé automatiquement. Si il existe déjà, il sera tronqué. Si l ouverture échoue, fopen renvoie NULL. Si elle réussie, fopen renvoie un pointeur vers un canal, et l on peut par la suite passer ce pointeur en argument aux diverses fonctions travaillant sur des FILE *. Pour fermer un canal après l avoir utilisé, on utilise FILE * fclose(file * fichier). Il ne faut pas faire de free, car fclose fait déjà ce qu il faut. Il est indispensable de fermer un canal après utilisation, pour au moins deux raisons : Les écritures dans un canal ne sont pas immédiates, elles sont regroupées en gros blocs, pour des raisons d efficacité, donc il reste souvent des données en attente d écriture, et la fermeture du canal déclenche l écriture de ces données Il y a souvent des limites au nombre de canaux qu un programme peut avoir ouvert simultanément. Si la fermeture réussie, fclose renvoie 0, autrement il renvoie la valeur EOF (une macro définie par stdio.h, qui a de multiples usages). On se retrouve avec le code suivant : // debut de l a manipulation du f i c h i e r FILE f 1 ; i f ( ( f 1 = fopen ( blop, r ))==NULL){ p r i n t f ( %s, e r r e u r l o r s de l ouverture de blop \n ) ; e x i t ( 1 ) ;

// u t i l i s a t i o n du f i c h i e r... // f i n de l a manipulation du f i c h i e r i f ( f c l o s e ( f 1)==EOF){ p r i n t f ( %s, e r r e u r l o r s de l a fermeture de blop \n ) ; e x i t ( 1 ) ; 1.2 Lecture par caractère La fonction pour lire un caractère depuis un canal fich est int fgetc(file * fich). Elle renvoie un entier, qui est soit un caractère, soit la valeur EOF si on se trouve à la fin du fichier. Lorsqu on ouvre un fichier, le programme a un «curseur» situé au début du fichier. Les premiers caractères lus seront les premiers caractères du fichiers. À chaque caractère lu, le curseur se décale d un caractère vers la fin du fichier. Exercice 1 Créez avec votre éditeur un fichier exo1.txt où figurera uniquement votre prénom puis votre nom séparés d un espace. Écrivez une fonction void prenom(file * f) qui lit le prenom sur le canal f censé pointer vers exo1.txt, et l affiche à l écran. Lancez la deux fois de suite dans le main. Que se passe-t il? Exercice 2 void lit prenom (FILE f ){ while ( ( ( c=f g e t c ( f ))!= ) && ( c!=eof) ) p r i n t f ( %c, c ) ; Exercice 3 Écrivez une fonction compte_c(file * f) qui renvoie le nombre de caractères d un fichier. Écrivez une fonction compte_m(file * F) qui renvoie le nombre de mots d un fichier. Les mots sont séparés par des espaces ou des retours à la ligne. Écrivez une fonction compte_l qui renvoie le nombre de lignes. Exercice 4 int compte c (FILE f ){ int cpt =0; while ( f g e t c ( f )!=EOF) return cpt ; cpt++; int compte m (FILE f ){ int cpt =0; int on est sur un mot =0; while ( ( c=f g e t c ( f ))!=EOF) i f ( c== c== \n ) on est sur un mot =0; else { i f (! on est sur un mot ) { on est sur un mot =1; cpt++;

return cpt ; int compte l (FILE f ){ int cpt =0; while ( ( c=f g e t c ( f ))!=EOF) i f ( c== \n ) cpt++; return cpt ; Exercice 5 Faites un programme qui prend en argument sur la ligne de commande le nom d un fichier, et une lettre (c,m ou l) et qui renvoie selon cette lettre soit le nombre de caractères, de mots ou de lignes du fichier. Exercice 6 int main ( int argc, char argv ){ FILE f ; i f ( argc! = 3! argv [ 2 ] [ 0 ] argv [ 2 ] [ 1 ] ( argv [ 2 ] [ 0 ]! = c &&argv [ 2 ] [ 0 ]! = m &&argv [ 2 ] [ 0 ]! = l ) ) { p r i n t f ( %s \n, mauvaise syntaxe ) ; e x i t ( 1 ) ; f=fopen ( argv [ 1 ], r ) ; i f (! f ) { p r i n t f ( %s \n, f i c h i e r i n e x i s t a n t ) ; switch ( argv [ 2 ] [ 0 ] ) { case c : p r i n t f ( nombre de l e t t r e s : %d\n, compte c ( f ) ) ; break ; case m : p r i n t f ( nombre de mots : %d\n, compte m ( f ) ) ; break ; case l : p r i n t f ( nombre de l i g n e s : %d\n, compte l ( f ) ) ; break ; f c l o s e ( f ) ; e x i t ( 0 ) ; 1.3 Écriture par caractère La fonction int fputc(char m, FILE * f) écrit dans le canal f le caractère m. Exercice 7 Écrivez un programme qui réécrit son code dans un autre fichier. Par exemple si ce programme s appelle exo_n.c, alors il crée un fichier copie_exo_n.c qui est une copie de lui-même. Exercice 8

#include <s t d i o. h> void c o p i e (FILE fs, FILE fd ){ while ( ( c=f g e t c ( f s ) )!= EOF) f putc ( c, fd ) ; int main ( int argc, char argv ){ FILE s ource = fopen ( c o p i e. c, r ) ; FILE dst = fopen ( c o p i e, w ) ; c o p i e ( source, dst ) ; f c l o s e ( s ource ) ; f c l o s e ( dst ) ; 1.4 Lecture et écriture Plusieurs fonctions permettent de lire et écrire dans des fichiers. Il existe entre autres fread et fwrite qui s emploient comme suit : fread : int fread(void * tableau, size_t taille, size_t n, FILE *f). Cette fonction tente de lire, dans le fichier f, n blocs de taille octets, et les écrit à l adresse tableau, qui doit donc pointer vers un tableau suffisamment grand que l on aura créé au préalable. Elle renvoie le nombre de blocs lus, qui peut être plus petit que n, par exemple si l on a atteint la fin du fichier, et elle renvoie 0 en cas d erreur. fwrite : int fwrite(void *tableau, int taille, int n, FILE *f) agit de manière similaire : elle écrit, dans le fichier f un nombre n de blocs de taille taille octets qu elle lit dans le tableau pointé par tableau. Elle renvoie le nombre de blocs écrits en résultat. Si il est inférieur à n, c est qu il y a eu une erreur. Exercice 9 À l aide de ces deux fonction écrire les fonctions mon_getc et mon_putc qui agissent comme les fonctions vues précédemment. Exercice 10 int mon getc (FILE f ){ char c ; i f ( f r e a d (&c, 1, 1, f )==0) return EOF; else return c ; int mon putc ( char c, FILE f ){ i f ( f w r i t e (&c, 1, 1, f )<1) return EOF; else return c ; Exercice 11 Écrivez un programme qui crée un formulaire : il prend en argument sur la ligne de commande un nom de fichier et des mots et crée un fichier avec un mot par ligne. Exercice 12 void c ree form ( int n, FILE f, char mots ){ int i ; for ( i =0; i <n ; i ++){ f w r i t e ( mots [ i ], 1, s t r l e n ( mots [ i ] ), f ) ; f w r i t e ( \n, 1, 1, f ) ;

int main ( int argc, char argv ){ FILE f 1=fopen ( argv [ 1 ], w ) ; cree form ( argc 2, f1, argv +2); f c l o s e ( f 1 ) ; 2 Entrée standard, sortie standard Quand un programme est lancé, il dispose de trois canaux d entrée sortie nommés stdin, stdout, et stderr. Ils peuvent être branchés sur des fichiers, mais c est rarement le cas. En temps normal, le canal stdin permet au programme de lire ce que l utilisateur tape sur le clavier, tandis que stdout et stderr sont affichés à l écran (la différence entre ces deux canaux est de nature purement conventionnelle : on est censé utiliser stdout pour des messages normaux, et stderr pour des messages d erreur, pour permettre à l utilisateur de trier entre les deux). Exercice 13 Implémenter une fonction affiche_ecran(char *s) qui affiche le contenu de s à l écran. Exercice 14 void a f f i c h e e c r a n ( char s ){ while ( s!= \0 ){ f putc ( s, stdout ) ; s++; Exercice 15 Implémenter un programme qui demande à l utilisateur de remplir un formulaire (par exemple nom, prénom, age, filière, adresse) et qui crée un fichier approprié avec toutes les données nécessaires. Exercice 16 char q u e s t i o n s []={ Nom, Prenom, age, f i l i e r e, Adresse, NULL ; void r e m p l i t (FILE out ) { char q u e s t i o n ; for ( q u e s t i o n=q u e s t i o n s ; q u e s t i o n ; q u e s t i o n++) { p r i n t f ( %s?, q u e s t i o n ) ; // f p r i n t f f o n c t i o n n e comme p r i n t f, avec un premier argument en p l u s // pour s p e c i f i e r sur q u e l canal e c r i r e. f p r i n t f ( out, %s :, q u e s t i o n ) ; while ( ( c=f g e t c ( s t d i n ))!= \n &&c!=eof) fputc ( c, out ) ; fputc ( \n, out ) ; fputc ( \n, stdout ) ; int main ( int argc, char argv ) { FILE out ; i f ( argc!=2) { f p r i n t f ( s t d e r r, %s \n, I l f a u t p a s s e r exactement un argument. ) ;

e x i t ( 1 ) ; out=fopen ( argv [ 1 ], w ) ; i f ( out==null) { p e r r o r ( Echec l o r s de l ouverture du f i c h i e r ) ; e x i t ( 2 ) ; r e m p l i t ( out ) ; i f ( f c l o s e ( out ) ) e x i t ( 3 ) ; else e x i t ( 0 ) ;