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.
|
la fonction \texttt{main} et ses deux paramètres.
|
||||||
Il est temps de préciser les détails.
|
Il est temps de préciser les détails.
|
||||||
|
|
||||||
|
XXX\index{XXX}
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% ---------------------------------------------------------
|
||||||
|
|
||||||
\section{Entrées / Sorties}
|
\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
|
très bien, mais la fonction de lecture est piégeuse
|
||||||
"\textsc{It's a trap}", comme nous allons bientôt le voir.
|
"\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}}
|
\subsection{Écrire : \texttt{printf}}
|
||||||
\index{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
|
est appelé \emph{chaine de format}. C'est une chaine de caractères
|
||||||
que l'on peut classer en trois catégories~:
|
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
|
\item{\textsl{caractères crus} : ils sont directements poussés vers
|
||||||
caractère '\%'.
|
la sortie. La plupart d'entre eux donnent le résultat attendu.}
|
||||||
|
|
||||||
\textsl{échappements} : les caratères précédés d'un
|
\item{\textsl{codes de format} : les fragments qui commencent par le
|
||||||
'\textbackslash'.
|
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}}
|
\subsection{Lire : \texttt{scanf}}
|
||||||
\index{scanf}
|
\index{scanf}
|
||||||
|
|
||||||
Avez-vous bien révisé la section qui cause des pointeurs ?
|
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}
|
\end{verbatim}
|
||||||
|
|
||||||
Pour une explication plus détaillée sur les mécanismes
|
Pour une explication plus détaillée sur les mécanismes
|
||||||
utilisés et les usages possibles,
|
utilisés et les usages possibles d'un tel filtre,
|
||||||
il faut voir le concept de pipeline en
|
il faut voir le concept de pipeline du shell en
|
||||||
page \pageref{pipeline}.
|
page \pageref{pipeline}.
|
||||||
|
|
||||||
% ---------------------------------------------------------
|
% ---------------------------------------------------------
|
||||||
@ -351,7 +417,7 @@ divers comme Open Sound Control (page \pageref{chap:OSC}) ou
|
|||||||
libsndfile (page \pageref{chap:son}).
|
libsndfile (page \pageref{chap:son}).
|
||||||
Et pour les gens du système~:
|
Et pour les gens du système~:
|
||||||
l'utilisation des signaux (page \pageref{get-signal}),
|
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