Les fichiers en C

Les fichiers en C - C - Programmation

Marsh Posté le 26-12-2011 à 20:09:43    

Bonjour tout le monde , j'ai un problème pour manipuler les fichiers en langage C et je voudrais que vous m'aidez s'il vous plait.
 
Ma fonction "lit_fichier", elle doit recevoir en parametre le nom du fichier à lire que j'ai stocké dans une chaine de caractères,puis effectuer des traitements.
 
Dans ma fonction main(), j'appelle la fonction "lit_fichier" en lui passant la chaine de caractères qui contenant le nom du fichier.
 
Quand je compile ca marche, mais si j'exécute ca me signale une erreur de segmentation au niveau de la fonction (au niveau des parametres) et au niveau de "getline". Voici le programme (que j'ai réduit) :
 
      //Ma fonction lit_fichier
 
int lit_fichier ( char *fichier)
{
  FILE *input;
  int a=255;
  int error;
   
  error = 0;
 
  input = fopen("fichier","r" );   //la chaine "fichier" contient le nom du fichier
 
  if ( input==NULL )
  {
    printf("  Impossible d'ouvrir ce fichier. \n " );
    exit ( 1 );
  }
 
  while ( 1 )
  {
    getline (&line,&a,input);
 
  // j'effectue mes traitements
     
  }
     
 // j'effectue mes traitements
 
  fclose(input);
 
  return error;
}  
 
 
// Ma fonction main
 
int main (void)
 
{
 
  int c_num;
  char *cnf_file_name = "fichier_cnf.cnf";  //je stocke le nom du fichier
  int error;
  int l_num;
  int v_num;
 
 
  error = lit_fichier (cnf_file_name);   // j'appelle la fonction
 
  if ( error )
  {
    printf("  L'entete ne peut pas etre lue.\n" );
    return;
  }
 
  printf("\n" );
  printf("  Nombre de variables       V_NUM  = %d \n",v_num);
  printf("  Nombre de clauses         C_NUM  = %d \n",c_num);
  printf("  Nombre de literals signés L_NUM  = %d \n",l_num);
 
  return;
}

Message cité 1 fois
Message édité par Elmoricq le 27-12-2011 à 10:24:39
Reply

Marsh Posté le 26-12-2011 à 20:09:43   

Reply

Marsh Posté le 27-12-2011 à 00:00:31    

Le while ( 1 )  
  {  
    getline (&line,&a,input);  
 
  // j'effectue mes traitements  
     
  }  
me paraît plus que bizarre, comment fait-on pour sortir de cette boucle infinie ?

Reply

Marsh Posté le 27-12-2011 à 01:14:00    

Trap, merci pour ton intervention. En fait j'ai reduit le code au maximum pour ne dire que l'essentiel car il est très long,la boucle  "while" se termine bien car avant de la fermer, j'ai un "  if (input==null)  exit (1) ; ",ce qui me faire sortir de la boucle.

Reply

Marsh Posté le 27-12-2011 à 03:11:45    

baboye11 a écrit :

Bonjour tout le monde , j'ai un problème pour manipuler les fichiers en langage C et je voudrais que vous m'aidez s'il vous plait.
 
Ma fonction "lit_fichier", elle doit recevoir en parametre le nom du fichier à lire que j'ai stocké dans une chaine de caractères,puis effectuer des traitements.
 
Dans ma fonction main(), j'appelle la fonction "lit_fichier" en lui passant la chaine de caractères qui contenant le nom du fichier.
 
Quand je compile ca marche, mais si j'exécute ca me signale une erreur de segmentation au niveau de la fonction (au niveau des parametres) et au niveau de "getline". Voici le programme (que j'ai réduit) :
 
      //Ma fonction lit_fichier
 
int lit_fichier ( char *fichier)
{
  FILE *input;
  int a=255;
  int error;
   
  error = 0;
 
  input = fopen("fichier","r" );   //la chaine "fichier" contient le nom du fichier
 
  if ( input==NULL )
  {
    printf("  Impossible d'ouvrir ce fichier. \n " );
    exit ( 1 );
  }
 
  while ( 1 )
  {
    getline (&line,&a,input);
 
  // j'effectue mes traitements
     
  }
     
 // j'effectue mes traitements
 
  fclose(input);
 
  return error;
}  
 
 
// Ma fonction main
 
int main (void)
 
{
 
  int c_num;
  char *cnf_file_name = "fichier_cnf.cnf";  //je stocke le nom du fichier
  int error;
  int l_num;
  int v_num;
 
 
  error = lit_fichier (cnf_file_name);   // j'appelle la fonction
 
  if ( error )
  {
    printf("  L'entete ne peut pas etre lue.\n" );
    return;
  }
 
  printf("\n" );
  printf("  Nombre de variables       V_NUM  = %d \n",v_num);
  printf("  Nombre de clauses         C_NUM  = %d \n",c_num);
  printf("  Nombre de literals signés L_NUM  = %d \n",l_num);
 
  return;pasdsée a getline;
}


 
Utilise les balises [cpp] pour échapper le code.
Ou est déclarée, initialisée la variable line  

Reply

Marsh Posté le 27-12-2011 à 10:27:18    

baboye11 a écrit :

Trap, merci pour ton intervention. En fait j'ai reduit le code au maximum pour ne dire que l'essentiel car il est très long,la boucle  "while" se termine bien car avant de la fermer, j'ai un "  if (input==null)  exit (1) ; ",ce qui me faire sortir de la boucle.


 
Tu fais même plus que sortir de la boucle, exit() sort complètement du programme, avec un code d'erreur de surcroît (code retour != 0).
 
Le plus propre serait, tout simplement, de mettre la condition de sortie dans le test de ta boucle et non écrire une boucle infinie.
Quelque chose comme ça :

while (input != null)


 
De sorte que si input == null au moment du test, la boucle s'arrête.

Reply

Marsh Posté le 27-12-2011 à 15:58:00    

Merci là c'est plus correcte,mais mon problème n'est toujours pas resolu ???

Reply

Marsh Posté le 27-12-2011 à 16:46:46    

Tu as un peu trop réduit le code. De plus getline() ne me semble pas être une fonction standard C, tu l'as trouvée où ?
Le plus simple et qui te servira beaucoup par la suite: as-tu essayé d'utiliser un debugger ?


Message édité par Elmoricq le 27-12-2011 à 16:51:08
Reply

Marsh Posté le 27-12-2011 à 17:13:45    

J'ai remplacé getline() par fgets() et ca marche,comment ca marche le debugger,je signale que je compile avec gcc .

Reply

Marsh Posté le 28-12-2011 à 12:06:56    

baboye11 a écrit :

J'ai remplacé getline() par fgets() et ca marche,comment ca marche le debugger,je signale que je compile avec gcc .


 
 
Pour utiliser le debugger ( gdb par exemple dans ton cas), il faut d'abord compiler le programme avec les symboles. Option -g de gcc.
 
Ensuite, pour debugger ton programme , tu lances gdb nom_de_ton_programme. Tu auras alors un prompt dans lequel tu pourras lancer des commandes spécifiques au debugger.
 
Tu peux alors placer des points d'arrêt dans ton programme en tapant break nomfichier.c:numéroligne
 
Tu lances ton programme en tapant run
 
et ton programme va se lancer normalement jusqu'à un point d'arrêt ou un signal l'interrompant ( un ecrasement mémoire par  exemple qui declenche un SIGSEGV ).
 
lorsque le programme est interrompu , tu peux observer l'état courant de la pile en tapant bt , ou afficher l'état de variable en tapant print nomvariable ( dans le contexte ). Tu peux également exécuter pas à pas ton programme s'il a été interrompu par un point d'arret ( break ci-dessus ), en tapant next / nexti , ou step / stepi si tu veux rentrer dans la fonction.
 
Enfin, continue  te permet de poursuivre à nouveau le programme jusqu'à la prochaine interruption.
 
 
Tu peux avoir également des GUI par dessus gcc. Personnellement, j'utilise kdbg qui est pas trop mal et qui ressemble au debugger de visual sur certains points.

Reply

Marsh Posté le 28-12-2011 à 18:23:13    

Merci  Xilebo, je parviens à debugger et ca m'a permis de resoudre beaucoup d'erreur,maintenant ca me signale une nouvelle erreur qui me dépasse, quand j'exécute,à un certain niveau ca m'affiche ceci :  
 
  Fatal error!
  Unexpected End of input.
 
Je pensais que j'avais oublié de fermer le fichier "fclose(input)" mais je l'ai bien fermé.J'aimerai que vous me dites ce que signifie cette erreur SVP !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed