Bonjour Développeurs,

J'ai tenté de faire un script qui me permettait de lire un fichier d'abord par ligne, ensuite par caractère afin de récupérer certaines données du fichier.

Le fait est que mon fichier est de forme suivante :
$une ou plusieurs lignes de commentaire pré-signalées par "$"
000110110111010#
ceci est la dernière ligne du fichier
# me déterminant la fin de la ligne des données, ce que je souhaite récupérer.

J'ai donc fait ce code :

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
#include <stdio.h>																	//Appel de la librairie Input/Output
#include <stdlib.h>																	//Appel de la librairie Standard
#include <string.h>																	//Appel de la librairie String

#include "dblist.h"																	//Ajout des Listes Doublements Chainees

int main()
{

	dblist *listeDC = malloc(sizeof(dblist));										//Declaration de la liste doublement chainee 
	Init(listeDC);																	//Initialisation de la liste doublement chainee
	FILE *fichierDonnees = fopen("donnees.txt", "r");								//Déclaration et instanciation d'un pointeur de type fichier vers les donnees
	char caractere;																	//Déclaration d'une variable caractere
	int compteur;																	//Declaration et initialisation d'un compteur
	int finDonnees = 0;																//Déclaration et initialisation d'une variable "booleene" permettant d'arreter la lecture du fichier après avoir lu les donnees
	char ligne[64];																	//Espace temporaire pour récupérer une ligne d'un fichier

		////Traitement des donnees////
			if(fichierDonnees != NULL)												//Ouverture du fichier réussie
			{
				// Lecture des lignes du fichier de donnees
puts("Ouverture fichier ok");
				while((fgets(ligne, sizeof ligne, fichierDonnees) != NULL) && (finDonnees = 0))
				{																	//Tant que l'on peut lire une ligne du fichier et que la variable "booleene" finDonnees est a faux
puts("passage while");
					caractere = ligne[0];											//Lecture du premier caractere de la ligne
					if(caractere == '$'){											//Ligne de commentaire
puts("commentaire");
						printf("Commentaire : %s",ligne);							//Affichage du commentaire
					}
					else{															//Il s'agit d'une ligne de données
puts("donnees");
						compteur = 0;												//Initialisation du compteur de caracteres
						while (caractere != '#'){									//Vérification de non fin de données atteinte
puts("lecture d'un caractère");
								//printf("%c", caractere);										//Affichage du caractère
								PushBack(listeDC,caractere);						//Ajout du caractère en dernière position de la liste
								compteur++;
								caractere = ligne[compteur];
						}
						if(caractere == '#'){										//Fin de données atteinte
							finDonnees = 1;											//Mise à "vrai" de la variable "booleene"
						}
					}
				}
			}
			else
			{
puts("pas lecture fichier");
				if (feof(fichierDonnees))											//Fin de fichier detectee
				{
					puts("\nFin du fichier de donnees atteinte.");
				}

				if (ferror(fichierDonnees))											//Une erreur s'est produite
				{
					perror("donnees.txt");
				}
			}
			
			fclose (fichierDonnees);												//Fermeture du fichier de donnees
puts("lecture liste");
			View(*listeDC);															//Affichage de la liste doublement chainee
puts("fin lecture liste");

		////Fin du traitement des donnees////

puts("finit");
}
Mais il ne rentre pas dans le While que dont la condition est en rouge.

Si je remplace le code de façon "sale" par un :
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
 
				while((fgets(ligne, sizeof ligne, fichierDonnees) != NULL)/* && (finDonnees = 0)*/)
				{																	//Tant que l'on peut lire une ligne du fichier et que la variable "booleene" finDonnees est a faux
					caractere = ligne[0];											//Lecture du premier caractere de la ligne
					if(caractere == '$'){									//Ligne de commentaire
						printf("Commentaire : %s",ligne);							//Affichage du commentaire
					}
					else{															//Il s'agit d'une ligne de données
						compteur = 0;												//Initialisation du compteur de caracteres
						while (caractere != '#'){									//Vérification de non fin de données atteinte
								//printf("%c", caractere);									//Affichage du caractère
								PushBack(listeDC,caractere);						//Ajout du caractère en dernière position de la liste
								compteur++;
								caractere = ligne[compteur];
						}
						if(caractere == '#'){										//Fin de données atteinte
							//finDonnees = 1;											//Mise à "vrai" de la variable "booleene"
							break;
						}
					}
				}
J'obtiens l'effet escompté mais je ne suis pas du tout satisfaite... Sortir d'une boucle par un break :s

J'aurais voulu savoir comment faire pour améliorer ce code.

Pour le code de la liste double, il s'agit de celui qui est dans les cours de developpez

http://chgi.developpez.com/dblist/

Avec quelques mineures modifications.

Merci à vous,