more bla in C chapter
This commit is contained in:
parent
b7af954be6
commit
b04f51b032
82
chap/C.tex
82
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 <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}).
|
||||
|
||||
|
||||
% ---------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user