more bla in C chapter

This commit is contained in:
tth 2021-09-27 00:57:38 +02:00
parent b7af954be6
commit b04f51b032
1 changed files with 74 additions and 8 deletions

View File

@ -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 <stdio.h>
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}).
% ---------------------------------------------------------