diff --git a/chap/C.tex b/chap/C.tex index f6f96a5..1a621be 100644 --- a/chap/C.tex +++ b/chap/C.tex @@ -95,6 +95,8 @@ Nous avons vu brièvement dans la première section de ce chapitre la fonction \texttt{main} et ses deux paramètres. Il est temps de préciser les détails. +XXX\index{XXX} + % --------------------------------------------------------- \section{Entrées / Sorties} @@ -125,6 +127,20 @@ et afficher un caractère dans \texttt{stdout}. Tout cela semble très bien, mais la fonction de lecture est piégeuse "\textsc{It's a trap}", comme nous allons bientôt le voir. +Vous devez logiquement penser que si nous allons lire un caractère +depuis l'entrée du programme, nous pouvons utiliser une variable de +type \texttt{char}, puisque ce type est prévu pour stocker un +caractère. Seulement, pour indiquer l'abscence de caractère, +la fin du fichier, il nous faut une valeur \textsl{out of band} +et donc getchar renvoit en fait un \texttt{int} dont une valeur +particulière sera nommée \texttt{EOF}, \textsl{end of file}. + +\begin{verbatim} +while (EOF != (foo=getchar())) { .... +\end{verbatim} + +Voilà un piège éliminé, et vous trouverez un exemple complet +un peu plus loin. \subsection{Écrire : \texttt{printf}} \index{printf} @@ -147,20 +163,70 @@ Le premier de ces paramêtres, \texttt{"foo = \%d\textbackslash{}n"}, est appelé \emph{chaine de format}. C'est une chaine de caractères que l'on peut classer en trois catégories~: -\textsl{caractères crus} : ils sont directements poussés vers la sortie. +\begin{itemize} -\textsl{codes de format} : les fragments qui commencent par le -caractère '\%'. +\item{\textsl{caractères crus} : ils sont directements poussés vers +la sortie. La plupart d'entre eux donnent le résultat attendu.} -\textsl{échappements} : les caratères précédés d'un -'\textbackslash'. +\item{\textsl{codes de format} : les fragments qui commencent par le +caractère '\%'. Ils servent à contrôler l'apparence de ce qui va +suivre. Par exemple \texttt{\%x} va afficher un int en hexadécimal} +\item{\textsl{échappements} : les caractères précédés d'un +'\textbackslash' ou \textsl{backslash}\footnote{barre-penchée-du-8} +permettent d'inclure dans la chaine de format des caractères +non imprimables. +Par exemple, \texttt{'\textbackslash{}n'} va générer le caractère +\textsl{newline} qui marque la fin d'une ligne de texte. +} +\end{itemize} \subsection{Lire : \texttt{scanf}} \index{scanf} Avez-vous bien révisé la section qui cause des pointeurs ? +Êtes-vous prèt à d'étranges comportements ? +Alors les subtilités de scanf vont vous plaire. + +\textit{To be continued...} + +\subsection{Les fichiers}\index{fopen}\index{fclose} + +Lire et écrire depuis les flux gérés par le système, c'est bien, mais +c'est mieux de pouvoir faire la même chose depuis ou vers un fichier +enregistré. Il nous faut un moyen pour se 'connecter' à un ficher, et +y balancer des trucs à grand coup de printf. + +Ce mécanisme passe par la fonction \texttt{fopen} et \texttt{fclose}. +La première va nous renvoyer (si tout se passe bien) un pointeur +sur une structure opaque de type \texttt{FILE *} qui pourra être +utilisé dans la suite des opérations. Voici son prototype~: + +\begin{verbatim} +#include +FILE *fopen(const char *pathname, const char *mode); +\end{verbatim} + +Le premier paramêtre est le nom du fichier concerné, possiblement avec +son chemin d'accès (absolu ou relatif), comme \texttt{"foo.fimg"}, +\texttt{"/var/tmp/foo.data"} ou \texttt{"./bla.txt"}. +Le second est le mode d'accès à ce fichier. Ce mode précise, entre +autres, si nous souhaitons lire ou écrire dans ce fichier. +La valeur retournée par cette fonction est un pointeur qui peut +être égal à \texttt{NULL} en cas d'erreur~: par exemple le fichier +n'existe pas ou ne peut pas être crée. + +Notre fichier est maintenant ouvert, la fonction \texttt{fprintf} va +nous permettre d'écrire quelque chose dedans. Elle est analogue au +\texttt{prinf} vu un peu plus tôt, sauf qu'elle demande un +argument supplémentaire, et c'est justement le pointeur retourné +par \texttt{fopen}~: + +\begin{verbatim} +int fprintf(FILE *stream, const char *format, ...); +\end{verbatim} + % --------------------------------------------------------- @@ -189,8 +255,8 @@ $ \end{verbatim} Pour une explication plus détaillée sur les mécanismes -utilisés et les usages possibles, -il faut voir le concept de pipeline en +utilisés et les usages possibles d'un tel filtre, +il faut voir le concept de pipeline du shell en page \pageref{pipeline}. % --------------------------------------------------------- @@ -351,7 +417,7 @@ divers comme Open Sound Control (page \pageref{chap:OSC}) ou libsndfile (page \pageref{chap:son}). Et pour les gens du système~: l'utilisation des signaux (page \pageref{get-signal}), -le chargement dynamique (page \pageref{ex_dlopen}. +le chargement dynamique (page \pageref{ex_dlopen}). % ---------------------------------------------------------