Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1546 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Les fichiers en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Les fichiers en C

n°2118373
baboye11
l'entre-aide avant tout.
Posté le 26-12-2011 à 20:09:43  profilanswer
 

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
mood
Publicité
Posté le 26-12-2011 à 20:09:43  profilanswer
 

n°2118385
Trap D
Posté le 27-12-2011 à 00:00:31  profilanswer
 

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 ?

n°2118390
baboye11
l'entre-aide avant tout.
Posté le 27-12-2011 à 01:14:00  profilanswer
 

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.

n°2118393
Anonymouse
Posté le 27-12-2011 à 03:11:45  profilanswer
 

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  

n°2118408
Elmoricq
Modérateur
Posté le 27-12-2011 à 10:27:18  profilanswer
 

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.

n°2118448
baboye11
l'entre-aide avant tout.
Posté le 27-12-2011 à 15:58:00  profilanswer
 

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

n°2118456
Elmoricq
Modérateur
Posté le 27-12-2011 à 16:46:46  profilanswer
 

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
n°2118459
baboye11
l'entre-aide avant tout.
Posté le 27-12-2011 à 17:13:45  profilanswer
 

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

n°2118538
xilebo
noone
Posté le 28-12-2011 à 12:06:56  profilanswer
 

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.

n°2118585
baboye11
l'entre-aide avant tout.
Posté le 28-12-2011 à 18:23:13  profilanswer
 

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 !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Les fichiers en C

 

Sujets relatifs
Code C-Lecture de fichiers à partir d'un dossier.[Batch] Rechercher des fichiers dans C:
utiliser le langage C dans des fichiers cppboucle pour ouvrir plusieurs fichiers en C
[C#] Service Windows vérification fichiers périodique et alerte mail[C/C++] Transformation de fichiers
[C] Bus error, arbre et fichiers[C#] Comparer les lignes de 2 fichiers txt
Inclure des fichiers en C.[Résolu] Problème pour lire et écrire des fichiers pgm en C++
Plus de sujets relatifs à : Les fichiers en C


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR