1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int clean_fgets(char const *s_buffer, FILE *fp);
static char * read_line(char *s_buffer, size_t buff_size, FILE *file, int line);
int main(void)
{
int err = EXIT_SUCCESS;
FILE *fp = NULL;
char s_buffer[100] = {0};
fp = fopen("test.txt", "r");
if (fp != NULL)
{
if (read_line(s_buffer, sizeof s_buffer, fp, 3) != NULL)
{
puts(s_buffer);
}
else
{
fprintf(stderr, "La fin du fichier a été atteinte!\n");
}
fclose(fp), fp = NULL;
}
else
{
err = EXIT_FAILURE;
fprintf(stderr, "Impossible d'ouvrir le fichier!\n");
}
return err;
}
/**
* Lit la ligne n°line dans le fichier passé en argument et place le contenu
* de cette ligne le tampon.
*
* ATTENTION: un message d'avertissement s'affiche si la taille du tampon est
* insuffisante pour accueillir la ligne line, et que celle-ci a dû être
* tronquée
*
* @param s_buffer tampon dans lequel sera placé la ligne lue
* @param buff_size taille du tampon
* @param file pointeur sur le fichier ouvert en lecture par l'utilisateur
* @param line numéro de la ligne à lire
*
* @return pointeur sur le début du tampon passé en argument si la lecture a
* été un succès, ou NULL si la fin du fichier a été rencontrée.
*/
static char * read_line(char *s_buffer, size_t buff_size, FILE *file, int line)
{
int i = line;
char *p_ret = NULL;
while (i-- > 0 && (p_ret = fgets(s_buffer, buff_size, file)) != NULL)
{
continue;
}
if (clean_fgets(s_buffer, file) != 0)
{
fprintf(stderr, "La ligne %d est trop longue et a été tronquée!\n", line);
}
return p_ret;
}
/**
* Teste si la ligne du fichier ou l'entrée utilisateur à partir du flux d'entrée
* standard n'a pas été tronquée par fgets(). Si la saisie est incomplète, le
* reste de la ligne (si on travail sur un fichier) est ignoré ou le tampon du
* flux d'entrée standard (si on travail sur stdin) est purgé, et un code
* d'erreur est retourné.
*
* Si la saisie est correcte, le caractère de nouvelle ligne '\n' placé dans
* le tampon par fgets() et effacé.
*
* @param s_buffer tampon contenant la saisie de fgets()
* @param fp pointeur sur le fichier considéré, ou sur le flux d'entrée standard
* @return code d'erreur dont la veleur est 1 en cas de saisie tronquée, et 0
* en cas de saisie correcte
*/
static int clean_fgets(char const *s_buffer, FILE *fp)
{
int err = 0; /* error code */
char *pc = strchr(s_buffer,'\n');
if (pc != NULL) /* input OK */
{
*pc = '\0';
}
else /* input has been truncated */
{
int c;
while ((c = fgetc(fp)) != '\n' && c != EOF)
{
/* We ignore all the remaining characters */
continue;
}
/* we report that an error has been encountered */
err = 1;
}
return err;
} |
Partager