cours 7 - entrées/sorties et fichiers

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

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

Le prototype de la fonction main()

Les fichiers. Chapitre 4

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)

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

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

Algorithmique et Programmation, IMA

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

Programmation système en C/C++

GESTION DES FICHIERS C/UNIX

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

Gestion des fichiers. Telecom-ParisTech BCI Informatique

Cours Programmation Système

Rappels Entrées -Sorties

Cours 6 : Tubes anonymes et nommés

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

Programmation en langage C Eléments de syntaxe

Les structures. Chapitre 3

Introduction au langage C

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

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

Les processus. Système L3, /39

Cours 14 Les fichiers


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

COMPARAISONDESLANGAGESC, C++, JAVA ET

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

Programmation Structurée Langage C

Programmation Système (en C sous linux) Rémy Malgouyres LIMOS UMR 6158, IUT département info Université Clermont 1, B.P.

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

Le langage C. Séance n 4

SUPPORT DE COURS. Langage C

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

INF 104 (SELC) Introduction au langage C

INFO-F-105 Language de programmation I Séance VI

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

Cours de Système : Gestion de Fichiers

Cours de C. Allocation dynamique. Sébastien Paumier

Arguments d un programme

Utilisation d objets : String et ArrayList

Derrière toi Une machine virtuelle!

Programmation en langage C

Les chaînes de caractères

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

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

Le traitement du temps

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

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

Notes sur le Langage C

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

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

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

Java Licence Professionnelle CISII,

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

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

Chapitre 1 : La gestion dynamique de la mémoire

I00 Éléments d architecture

Architecture d un système d exploitation

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

Premiers Pas en Programmation Objet : les Classes et les Objets

ACTIVITÉ DE PROGRAMMATION

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

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Introduction au Langage de Programmation C

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

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

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

Programme Compte bancaire (code)

Communication par sockets

Projet de programmation (IK3) : TP n 1 Correction

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

Langages et Concepts de Programmation Introduction à la programmation en langage C

TP2 : tableaux dynamiques et listes chaînées

OS Réseaux et Programmation Système - C5

Gestion de la mémoire

Programmation Classique en langage C

V- Manipulations de nombres en binaire

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

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Table des matières. Chapitre 4 : Variables pointeurs

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Package Java.util Classe générique

Introduction au calcul parallèle avec OpenCL

TP 1. Prise en main du langage Python

Conventions d écriture et outils de mise au point

Programmation Réseau SSH et TLS (aka SSL)

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

Notes de Cours - Programmation Pascal Ferraro

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

Flux de données Lecture/Ecriture Fichiers

Exercice sur les Dockers

URECA Initiation Matlab 2 Laurent Ott. Initiation Matlab 2

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Transcription:

cours 7 - entrées/sorties et fichiers G. Bianchi, G. Blin, A. Bugeau, S. Gueorguieva, R. Uricaru 2015-2016 Programmation 1 - uf-info.ue.prog1@diff.u-bordeaux.fr

utilisation avancée de printf

retour de printf La fonction printf retourne le nombre de caractères écrits sur la sortie standard int main(int argc,char* argv[]) { int n=printf( command=%s\n,argv[0]); int i; for (i=1;i<n;i++) { //1 to n to avoid \n printf( - ); printf( \n ); return 0; $>./test_printf command=./test_printf --------------------- 2

retour de printf La fonction printf retourne un entier négatif en cas d erreur Evènement très rare lié à une sortie redirigée vers un fichier et une erreur d écriture dans ce dernier Plus de place sur le disque Absence du support amovible Problème de droits en écriture sur le fichier de redirection 3

affichage des entiers %d - entiers signés, %u - entiers non signés %o - entiers non signés en octal, %x %X - entiers non signés en hexadécimal int main(void) { int i=-45,j=43; printf( %d\n,i); printf( %u\n,i); printf( %o\n,j); printf( %x\n,j); printf( %X\n,j); return EXIT_SUCCESS; $>./a.out -45 4294967251 53 2b 2B 4

affichage des réels %f - standard avec 6 décimales %g - standard sans les zéros finaux %e %E - notation exponentielle int main(void){ double f=345.575; printf( %f\n,f); printf( %g\n,f); printf( %e\n,f); printf( %E\n,f); return EXIT_SUCCESS; $>./a.out 345.575000 345.575 3.455750e+002 3.455750E+002 5

formats spéciaux %p - affiche en hexadécimal des adresses mémoires %n - stocke le nombre de caractères déjà écrits (nécessite une variable où stocker ce nombre) int main(void){ int n; double d=458.21; printf( %g%n,d,&n); printf( =%d chars\n,n); printf( &n=%p\n,&n); return EXIT_SUCCESS; $>./a.out 458.21=6 chars &n=0022ff6c 6

le gabarit L entier inséré entre le % et la lettre définissant le type d affichage de la donnée correspond au nombre minimum de caractères à utiliser printf complète avec des espaces si nécessaire, ou des zéros si %0 est utilisé à la place de % int main(void){ printf( %5d\n,4); printf( %5d\n,123456); printf( %5f\n,3.1f); printf( %5s\n, abc ); printf( %05d\n,4); return EXIT_SUCCESS; $>./a.out 4 123456 3.100000 abc 00004 7

la précision L entier inséré entre un. et la lettre définissant le type d affichage de la donnée réelle correspond à la règle d arrondi %.3f correspond à un arrondi à 3 décimales Compatible avec un gabarit int main(void){ double f=3.14159265; printf( %.3f\n,f); printf( %08.3f\n,f); printf( %.4e\n,f); return EXIT_SUCCESS; $>./a.out 3.142 0003.142 3.1416e+000 8

gabarits et précisions variables Possibilité de définir des gabarits et précisions variables en fournissant, à la place de l entier, une variable en argument de printf localisée par un * int main(int argc, char* argv[]){ int i, tmp, max=0, k=6, n=3; float t=3.1455677; printf( %0*.*f\n, k, n, t); for (i=0;i<argc;i++) { $>./a.out is the command tmp=strlen(argv[i]); 03.146 if (tmp>max){ arg #0=./a.out max=tmp; arg #1= is arg #2= the arg #3=command for (i=0;i<argc;i++) { printf( arg #%d=%*s\n,i,max,argv[i]); return EXIT_SUCCESS; 9

signes des nombres %+d force l affichage du signe d un entier % d met un espace si le signe de l entier est un + int main(void){ float f=12.54f; float g=-12.54f; printf( %+f\n,f); printf( %+f\n,g); printf( % f\n,f); printf( % f\n,g); printf( %+.3f\n,f); return EXIT_SUCCESS; $>./a.out +12.540000-12.540000 12.540000-12.540000 +12.540 10

sprintf La fonction sprintf permet de stocker le résultat dans une chaîne de caractères supposée assez longue Attention aux débordements int main(void){ char* fname= John ; char* lname= Doe ; char email[256]; $>./a.out email=john.doe@labri.fr sprintf(email, %s.%s@labri.fr,fname,lname); printf( email=%s\n,email); return EXIT_SUCCESS; 11

getchar et gets Rappel: La fonction int getchar() renvoie le caractère lu ou la constante EOF en cas d erreur La fonction char* gets(char *s); permet la lecture d une chaîne de caractères, terminée par \n, sur l entrée standard et place le résultat dans la variable s int main(void){ char line[10]; printf( At most 9 characters?\n ); if(gets(line)==null){ return EXIT_FAILURE; return EXIT_SUCCESS; $>./a.out At most 9 characters? test Cette fonction retourne NULL en cas d erreur et s en cas de succès 12

getchar et gets Rappel: La fonction int getchar() renvoie le caractère lu ou la constante EOF en cas d erreur La fonction char* gets(char *s); permet la lecture d une chaîne de caractères, terminée par \n, sur l entrée standard et place le résultat dans la variable s int main(void){ char line[10]; printf( At most 9 characters?\n ); if(gets(line)==null){ return EXIT_FAILURE; return EXIT_SUCCESS; $>./a.out At most 9 characters? test Le caractère \n n est pas recopié dans la chaîne pointée par s et un caractère nul ( \0 ) est placé à la fin de la chaîne 13

getchar et gets Rappel: La fonction int getchar() renvoie le caractère lu ou la constante EOF en cas d erreur La fonction char* gets(char *s); permet la lecture d une chaîne de caractères, terminée par \n, sur l entrée standard et place le résultat dans la variable s int main(void){ char line[10]; printf( At most 9 characters?\n ); if(gets(line)==null){ return EXIT_FAILURE; return EXIT_SUCCESS; $>./a.out At most 9 characters? testtroplong Segmentation fault La fonction gets ne gère pas les débordements éventuels sur la chaîne passée en paramètre 14

les fichiers

qu est-ce qu un fichier? Un fichier est un espace de stockage de données Les opérations permises sont Lire, écrire et tronquer Il n est pas prévu de mécanisme pour enlever un morceau au milieu du fichier Après ouverture du fichier, toute opération de lecture ou d écriture s effectue relativement à une position courante dans le fichier Cette position indique la position de fin de la dernière lecture ou écriture dans le fichier 16

e/s de la librairie stdio.h La librairie stdio.h définit un type particulier nommé FILE pour décrire un fichier Cette structure varie selon les implémentations Il ne faut jamais utiliser ses champs directement Les fonctions de stdio.h FILE* fopen(const char* path, const char* mode); int fclose(file* stream); int fprintf(file* stream, const char* format,...); int fgetc(file* stream); int fputc(int c, FILE* stream); char* fgets(char* s, int n, FILE* stream); int fputs(const char* s, FILE* stream); size_t fread(void* ptr, size_t size, size_t n, FILE* stream); size_t fwrite(const void* ptr, size_t size, size_t n, FILE* stream); 17

ouvrir un fichier L ouverture d un fichier s effectue à l aide de la fonction FILE* fopen(const char* path, const char* mode); où path correspond au chemin de ce dernier et mode aux options d accès r ouvre le fichier en lecture seule w ouvre le fichier en écriture seule (le fichier est créé si nécessaire, écrasé si existant) a ouvre le fichier en écriture seule en fin de fichier (le fichier est créé si nécessaire) r+, w+, a+ ouvrer le fichier en lecture et écriture Les opérations s effectuent, par défaut, en mode texte Il faut toujours tester la valeur de retour 18

ouvrir un fichier Si le chemin du fichier est relatif, il l est par rapport au répertoire courant d exécution En cas de création du fichier, les droits dépendent du umask user file creation mode mask * (-rw-r--r-- par défaut) int main(void){ FILE* f=fopen( foo, w ); if (f==null){ exit(exit_failure); fprintf(f, hello\n ); fclose(f); return EXIT_SUCCESS; $>./a.out $>ls -l foo -rw-r--r-- 1 gblin uf-info 6 sep 17 15:38 foo * permissions par défaut d un répertoire ou d un fichier créé 19

fermer un fichier La fermeture d un fichier s effectue à l aide de la fonction int fclose(file* stream); Le paramètre stream Doit être non NULL Doit représenter une adresse valide Ne doit pas avoir déjà été fermé Tout fichier ouvert doit être fermé 20

fprintf La fonction int fprintf(file* stream, const char* format,...); fonctionne comme la fonction printf Trois fichiers spéciaux (stdout, stdin et stderr) de type FILE* permettent respectivement d interagir avec la sortie standard, l entrée standard et la sortie standard d erreur Le shell appelant le programme peut traiter spécifiquement et indépendamment chacun de ses fichiers spéciaux (pratique, par exemple, pour récupérer uniquement la sortie d erreur) printf(...) est équivalent à fprintf(stdout,...) 21

retour sur les erreurs graves En cas d erreur insurmontable, il est possible d interrompre le programme en appelant l instruction exit définie dans stdlib.h qui prend en paramètre EXIT_FAILURE ou EXIT_SUCCESS Il faut fournir un message d explication clair en utilisant la sortie d erreur standard int foo(){... if(erreur_fatale){ fprintf(stderr, A fatal error occured ); exit(exit_failure);... 22

fgetc et fputc Il est possible de lire et écrire un unique caractère à l aide des fonctions int fgetc(file* stream); et int fputc(int c, FILE* stream); Ces deux fonctions retourent EOF en cas d erreur Il n existe pas de caractère de fin de fichier EOF n est pas un caractère 23

fgets La fonction char* fgets(char* s, int n, FILE* stream); permet de lire des caractères dans un fichier et les stocke dans s jusqu à Un \n (copié dans le résultat) La fin du fichier Avoir lu n-1 caractères La fonction retourne NULL en cas d erreur, s sinon Le paramètre n permet d éviter les problèmes de débordement 24

fputs La fonction int fputs(const char* s, FILE* stream); permet d écrire la chaîne s dans le fichier stream en suivant le mode sélectionné lors de l ouverture La fonction retourne EOF en cas d erreur, 0 sinon 25

feof La fonction int feof(file* stream); permet de tester si la fin du fichier a été atteinte La fonction retourne 0 si la fin de fichier est atteinte Pas très pratique car cette fonction nécessite l échec d une lecture pour renvoyer la bonne valeur int main(void){ char s[4096]; FILE* f=fopen( foo, r ); if (f==null){ exit(exit_failure); while (!feof(f)) { fgets(s,4095,f); printf( ** %s **\n,s); fclose(f); return EXIT_SUCCESS; $>cat foo abc toto 23 $>./a.out ** abc toto ** ** 23 ** ** 23 ** 26

fseek La fonction int fseek(file* stream, long offset, int whence); modifie la position courante dans le fichier La position est définie comme la somme offset+whence whence peut prendre les valeurs SEEK_SET - début du fichier SEEK_CUR - position courante SEEK_END - fin du fichier 27

positionnement La fonction void rewind(file* stream); revient au début du fichier La fonction long ftell(file* stream); retourne la position courante du fichier long filesize(file* f) { long old_pos=ftell(f); fseek(f,0,seek_end); long size=1+ftell(f); fseek(f,old_pos,seek_set); return size; 28

doggy bag

to take away... Les formats d affichage peuvent être finement paramétrés à l aide des gabarits et précisions L ensemble des fonctions de la bibliothèque standard stdio.h permettent aisément une manipulation textuelle des données d un fichier L interaction avec le monde extérieur peut se faire à l aide des trois fichiers spéciaux que sont stdout, stdin et stderr 30

Questions? 31