talking about fgets

This commit is contained in:
tTh 2023-07-15 09:55:13 +02:00
parent 8ba88d2b8d
commit a1f8b096e3
4 changed files with 64 additions and 2 deletions

View File

@ -163,7 +163,8 @@ un peu plus loin.
La fonction \texttt{printf} permet d'afficher sur la sortie La fonction \texttt{printf} permet d'afficher sur la sortie
standard le contenu d'une (ou plusieurs) standard le contenu d'une (ou plusieurs)
variable sous diverses présentations, 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. la chaine de format.
\begin{verbatim} \begin{verbatim}
@ -217,18 +218,61 @@ for (foo=0; foo<1000; foo++) {
} }
\end{verbatim} \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}} \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 ? Ê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...} \textit{To be continued...}
% ---------------------------------------------------------
\subsection{Les fichiers}\index{fopen}\index{fclose} \subsection{Les fichiers}\index{fopen}\index{fclose}
Lire et écrire depuis les flux gérés par le système, c'est bien, mais Lire et écrire depuis les flux gérés par le système, c'est bien, mais

1
code/C/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
fgets-simple

View File

@ -8,3 +8,6 @@ no-op: no-op.c Makefile
slowprint: slowprint.c Makefile slowprint: slowprint.c Makefile
gcc -Wall $< -o $@ gcc -Wall $< -o $@
fgets-simple: fgets-simple.c Makefile
gcc -Wall $< -o $@

14
code/C/fgets-simple.c Normal file
View File

@ -0,0 +1,14 @@
/*
* exemple utilisation 'fgets'
*/
#include <stdio.h>
#include <string.h>
#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;
}