Salut,

J' écris deux fonctions pour lire de manière séquentielle
un fichier. Une tourne, l' autre non. Le problème est de lire la dernière ligne du fichier si elle est vide, après un retour de chariot.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
#include <stdio.h>
#include <string.h>
#include <assert.h>
 
int fget_buf( char * s , size_t nb, FILE * fd )
{ char * c, c1 ;
  int err =  0 ;
  if(  s == NULL  || nb <= 0 ||  fd == 0 ) return err = 2 ;
  if( fgets(s, nb , fd ) != NULL )
  {
    if( ( c = strchr( s , '\n' )) != NULL )
    { *c = '\0' ;
      err = 0 ;
      return err ;
    } else
    {
      while( (c1 = fgetc(fd) ) != '\n' && c1 != EOF);
      err = 1 ;
      return err ;
    }
   }
   else
   if( strlen(s) ) s[0] = '\0' ;
   return err ;
}
 
int fget_line( char * s , const size_t nb, FILE * fd  )
{ int err = 0;
  int c ;
  size_t w = 0 ;
  if( !s  || nb <= 0 ||  ! fd )
  { err = 2 ;
    return err ;
  }
  while ((c = fgetc (fd)) != '\n' && c != EOF)
  { if( w < nb - 1 )
    s[w++] = c;
    else
    { while((c = fgetc(fd)) != '\n' && c != EOF);
      err = 1;
      return err ;
    }
  }
 s[w] = '\0';
 return err;
}
 
 
int main ()
{ char z[128] ;
  int r = 1 ;
  FILE * fd = 0 ;
  fd = fopen("toto.txt", "r")  ;
  assert( fd != 0 ) ;
 
  while( ! feof(fd) )
  { memset( z, 0 , sizeof(z) ) ;
    r = fget_buf( z, sizeof(z), fd ) ;  // pas bon 
    //r = fget_line( z, sizeof(z), fd ) ;  // ok
 
    if( r == 0 )
    printf("%02d) =>%s\n", strlen(z), z ) ;
    else
    if( r == 2 )
    { printf("erreur globale\n") ;
      fclose(fd) ;
      return  ;
    }
    else
    if( r == 1 )
    { printf("saisie trop longue\n") ;
      fclose(fd) ;
      return ;
    }
  }
  fclose(fd) ;
  return 0 ;
}
C'est fget_buf qui pose problème. Si vous avez une idée ?