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 :
# me déterminant la fin de la ligne des données, ce que je souhaite récupérer.$une ou plusieurs lignes de commentaire pré-signalées par "$"
000110110111010#
ceci est la dernière ligne du fichier
J'ai donc fait ce code :
Mais il ne rentre pas dans le While que dont la condition est en rouge.
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"); }
Si je remplace le code de façon "sale" par un :
J'obtiens l'effet escompté mais je ne suis pas du tout satisfaite... Sortir d'une boucle par un break :s
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'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,
Partager