Les fichiers en C - C - Programmation
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 ?
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.
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. |
Utilise les balises [cpp] pour échapper le code.
Ou est déclarée, initialisée la variable line
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.
Marsh Posté le 27-12-2011 à 15:58:00
Merci là c'est plus correcte,mais mon problème n'est toujours pas resolu ???
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 ?
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 .
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.
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 !
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 édité par Elmoricq le 27-12-2011 à 10:24:39