From a1f8b096e37150e9f268b4f07cb3e776d68dac1b Mon Sep 17 00:00:00 2001 From: tTh Date: Sat, 15 Jul 2023 09:55:13 +0200 Subject: [PATCH] talking about fgets --- chap/C.tex | 48 +++++++++++++++++++++++++++++++++++++++++-- code/C/.gitignore | 1 + code/C/Makefile | 3 +++ code/C/fgets-simple.c | 14 +++++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 code/C/.gitignore create mode 100644 code/C/fgets-simple.c diff --git a/chap/C.tex b/chap/C.tex index 4b99f1c..958b86e 100644 --- a/chap/C.tex +++ b/chap/C.tex @@ -163,7 +163,8 @@ un peu plus loin. La fonction \texttt{printf} permet d'afficher sur la sortie standard le contenu d'une (ou plusieurs) variable sous diverses présentations, -qui sont contrôlables par un tout petit DSL\index{DSL}~: +qui sont contrôlables par un tout petit +DSL\footnote{\textsl{domain specific language}}\index{DSL}~: la chaine de format. \begin{verbatim} @@ -217,18 +218,61 @@ for (foo=0; foo<1000; foo++) { } \end{verbatim} +% --------------------------------------------------------- +% +% voir aussi ~/code/network/README.md +% +\subsection{Lire : \texttt{fgets}} +\index{fgets} + +Cette fonction a pour but de lire une ligne de texte depuis +une entrée (stdin, fichier, socket\index{socket}...) +et de la ranger en mémoire. +Mais commençons par lire la documentation\index{RTFM} de cette fonction, +en nous concentrant sur ces deux passages, avant de passer à +un exemple\footnote{encore en phase de méditation}. + +Voici deux extraits de ce que nous affirme la page du manuel~: + +\begin{verbatim} +DESCRIPTION + fgets() reads in at most one less than size characters from stream and + stores them into the buffer pointed to by s. Reading stops after an + EOF or a newline. If a newline is read, it is stored into the buffer. + A terminating null byte ('\0') is stored after the last character in + the buffer. + +RETURN VALUE + fgets() returns s on success, and NULL on error or when end of file oc‐ + curs while no characters have been read. +\end{verbatim} + +Prenez le temps d'y réfléchir, et essayons un cas simple d'utilisation +pour examiner le comportement de cette fonction. Nous allons +boucler sur la lecture d'une ligne depuis l'entrée standard dans +un buffer d'une taille fixée, puis afficher le nombre de caractères +que nous avons reçus. + +\lstinputlisting[language=c]{code/C/fgets-simple.c} + % --------------------------------------------------------- +% +% \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. +À ne plus savoir où peut être la tête de lecture ? +Alors les subtilités de \texttt{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 diff --git a/code/C/.gitignore b/code/C/.gitignore new file mode 100644 index 0000000..aa42deb --- /dev/null +++ b/code/C/.gitignore @@ -0,0 +1 @@ +fgets-simple diff --git a/code/C/Makefile b/code/C/Makefile index cc88ddd..9a49bbc 100644 --- a/code/C/Makefile +++ b/code/C/Makefile @@ -8,3 +8,6 @@ no-op: no-op.c Makefile slowprint: slowprint.c Makefile gcc -Wall $< -o $@ +fgets-simple: fgets-simple.c Makefile + gcc -Wall $< -o $@ + diff --git a/code/C/fgets-simple.c b/code/C/fgets-simple.c new file mode 100644 index 0000000..3c941d4 --- /dev/null +++ b/code/C/fgets-simple.c @@ -0,0 +1,14 @@ +/* + * exemple utilisation 'fgets' + */ +#include +#include +#define TL 8 +int main(int argc, char *argv[]) +{ +char buffer[TL+1]; +while( fgets(buffer, TL, stdin) ) { + printf(" %4ld\n", strlen(buffer)); + } +return 0; +}