mercredi 1 octobre 2014

Mise à niveau informatique : cours 5

Preambule

Il nous resterait encore bien des choses à voir ensemble mais on arrive à la fin de cette série de cours. À partir de maintenant nous allons à l'essentiel dans le contexte du projet sur lequel vous allez être noté (LAB3040). Le reste des points théoriques vu en deuxième année seront à travailler en autonomie à partir des support de cours du semestre 1 (que nous avons déjà pas mal utilisé) et semestre 2 (qui est totalement nouveau pour vous!).

Pour ce projet vous aurez besoin de savoir gérer des matrices et lire le contenu d'un fichier, c'est ce que nous allons voir aujourd'hui (mardi 7 octobre).

Les matrices

Les matrices, ou plus généralement les tableaux multidimensionnels, sont une extension de la notion de tableau. Nous allons voir  dans le support de cour du semestre 1 comment les allouer, les utiliser et les désallouer.
Pour vous entraîner faites un (nouveau) programme qui :
  • allouez un tableau à 2 dimensions (10x10 cases) contenant des nombres entiers. (via la fonction malloc bien sûr.)
  • initialisez son contenu, chaque case [i][j] devra contenir la somme i+j. C'est juste histoire d'avoir un contenu pour vérifier que tout marche bien. En partique, dans votre TP par exemple vous y stockerez des informations relative à votre labyrinthe.
  • affichez son contenu
  • désallouez cette matrice

Les fichiers

Vous ne trouverez pas d'information sur les fichiers dans les deux support de cours car ce sujet est vu en TP. Nous allons donc le voir ensemble aujourd'hui.

La première chose à comprendre sur les fichiers c'est qu'il y a 3 étapes principales lors de l'utilisation d'un fichier, un peu comme pour l'utilisation de la mémoire.
  • l'ouverture (c'est l'équivalent de l'allocation pour la mémoire). Cela se fait via l'instruction fopen. Tapez "man fopen" dans un terminal, et voyons cela ensemble.
  • l'utilisation, c'est à dire lire ou écrire dans le fichier
    • en mode texte : fprintf et fscanf
    • en mode binaire : fwrite et fread
  • la fermeture (c'est l'équivalent de la désallocation pour la mémoire), grâce à l'instruction fclose.
Notez que tout programme dispose de deux pointeurs de fichier , sans avoir ni à les déclarer ni à les ouvrir : stdin et stdout. Il s'agit des entrées et sorties standard du programme. Par défaut l'entrée standard d'un programme est le clavier , et la sortie standard est l'affichage dans le terminal.

Ces entrées/sorties peuvent être redirigés vers des fichiers lors de l'exécution du programme.
Par exemple : ./monProgramme < mesDonnes.txt > monResultat.txt
Dans ce cas les appels à scanf lirons les données dans le fichier mesDonnes.txt (au lieu de les attendre sur le clavier), et les appels à printf écriront les données dans le fichier monResultat.txt (au lieu de les afficher dans le terminal).

Mettons cela en pratique :
  • Modifiez votre programme de création de matrice de manière à ce qu'il écrive la matrice dans un fichier au lieu de l'afficher dans le terminal. Pour cela utilisez la fonction fprintf. Regardez le fichier crée.
  • Maintenant modifiez votre programme de manière à enregistrer les données non plus en mode texte mais en binaire via l'instruction fwrite (au lieu de fprintf).  Regardez le fichier crée, pourquoi ne pouvez vous pas le lire?
  • Faites maintenant un autre programme qui ira lire (avec fread) le fichier binaire crée à la question précédente. Faites un affichage des valeurs pour vous assurer que tout fonctionne.
Le prochain cours le 14 octobre , sera notre dernier cours de mise à niveau!
(et accessoirement aussi mon derniers cours à l'ESIEA ! après 10 ans de bons et loyaux services.)

Nous apprendrons à utiliser un debugger mémoire : valgrind. Cet outil est installé sur les machines de TP (et je vous conseille fortement de l'installer sur votre machine). Nous testerons alors tous les programmes que vous aurez écrit jusqu'ici. Vous comprendrez alors qu'il est illusoire de croire qu'on peut écrire un programme sans erreur, si on utilise pas un tel outil...