Lire des chiffres à partir d'un fichier texte
sonya
-
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis débutante avec le langage C.
Je cherche à lire un fichier texte et enregistrer une ligne et sauter une autre : une par une.
par exemple: ayant ces quatre lignes
1 2 2 4 8 7 14
2 1 2 4 8 7 14
1 3 2 5 10 6 12
3 1 2 5 10 6 12
Il me faut enregistrer uniquement : 1 2 2 4 8 7 14
1 3 2 5 10 6 12
J'ai écrit ce bout de code :
if ((entree = fopen(input_file, "r")) != NULL)
{
fscanf(entree, "%d %d %d \n", &nb_nodes, &nb_arcs, &nb_commodities);
//printf("%d %d %d",nb_nodes,nb_arcs,nb_commodities);
nb_edges=nb_arcs/2;
tab = (edge**) malloc(nb_edges * sizeof(**tab));
for (i = 0; i < nb_edges; i++)
{
fscanf(entree, "%d %d %d ", &head, &tail, &nb_facilities);
//printf("%d %d %d ", head, tail, nb_facilities);
courant_edge = ((edge*)calloc(1, sizeof(edge)));
courant_edge->num_edge = i+1;
courant_edge->source= head;
courant_edge->destination = tail;
courant_edge->le = nb_facilities;
taille_individu=taille_individu+courant_edge->le;
courant_edge->cost = ((float*)calloc(nb_facilities + 1, sizeof(float)));
courant_edge->capacity = ((float*)calloc(nb_facilities + 1, sizeof(float)));
for (j = 0; j <nb_facilities; j++)
{
fscanf(entree, "%f %f", &cost, &capacity);
courant_edge->cost[j] = cost;
courant_edge->capacity[j] = capacity;
//printf("%f %f ",courant_edge->cost[j],courant_edge->capacity[j]);
}
tab[i]=courant_edge;
fscanf(entree, "\n");
fclose(entree);
}
else
{
printf("impossible d'ouvrir le fichier input_file. getchar\n");
getchar();
}
}
Cependant lors de l'affichage je trouve qu'il saute des lignes et enregistre des autres de manière non conforme à ce que j'ai attendu.
Pourriez vous m'aider pour résoudre ce problème.
Je suis débutante avec le langage C.
Je cherche à lire un fichier texte et enregistrer une ligne et sauter une autre : une par une.
par exemple: ayant ces quatre lignes
1 2 2 4 8 7 14
2 1 2 4 8 7 14
1 3 2 5 10 6 12
3 1 2 5 10 6 12
Il me faut enregistrer uniquement : 1 2 2 4 8 7 14
1 3 2 5 10 6 12
J'ai écrit ce bout de code :
if ((entree = fopen(input_file, "r")) != NULL)
{
fscanf(entree, "%d %d %d \n", &nb_nodes, &nb_arcs, &nb_commodities);
//printf("%d %d %d",nb_nodes,nb_arcs,nb_commodities);
nb_edges=nb_arcs/2;
tab = (edge**) malloc(nb_edges * sizeof(**tab));
for (i = 0; i < nb_edges; i++)
{
fscanf(entree, "%d %d %d ", &head, &tail, &nb_facilities);
//printf("%d %d %d ", head, tail, nb_facilities);
courant_edge = ((edge*)calloc(1, sizeof(edge)));
courant_edge->num_edge = i+1;
courant_edge->source= head;
courant_edge->destination = tail;
courant_edge->le = nb_facilities;
taille_individu=taille_individu+courant_edge->le;
courant_edge->cost = ((float*)calloc(nb_facilities + 1, sizeof(float)));
courant_edge->capacity = ((float*)calloc(nb_facilities + 1, sizeof(float)));
for (j = 0; j <nb_facilities; j++)
{
fscanf(entree, "%f %f", &cost, &capacity);
courant_edge->cost[j] = cost;
courant_edge->capacity[j] = capacity;
//printf("%f %f ",courant_edge->cost[j],courant_edge->capacity[j]);
}
tab[i]=courant_edge;
fscanf(entree, "\n");
fclose(entree);
}
else
{
printf("impossible d'ouvrir le fichier input_file. getchar\n");
getchar();
}
}
Cependant lors de l'affichage je trouve qu'il saute des lignes et enregistre des autres de manière non conforme à ce que j'ai attendu.
Pourriez vous m'aider pour résoudre ce problème.
1 réponse
-
Salut,
Si tu veux récupérer des lignes, et bien... récupère des lignes :-)
Pour lire une ligne sur deux, tu peux faire comme cela :
#include <stdio.h> int main(void) { FILE * fich; char st[BUFSIZ]; fich = fopen("data.txt" , "r"); if (fich == NULL) { perror("Error opening file"); return 1; } while (1) { if (fgets(st, 100, fich) != NULL) { printf("j'ai récupéré : %s", st); /* faire ce que tu veux avec la ligne récupérée * en la déchiffrant avec sscanf */ if (fgets (st, 100, fich) == NULL) break; } else { break; } } fclose(fich); return 0; }
Dans la boucle, utilise tout ou partie des données de la ligne récupérée avecsscanf()
, pour les mettre dans tes structures de données.
http://www.cplusplus.com/reference/cstdio/sscanf/
Dal-
-
Le seul cas où ce code peut afficher des lignes "désordonnées", c'est à dire autrement qu'une ligne sur deux, serait le cas où les lignes ne seraient pas courtes comme dans ton exemple, où elles font 16 caractères au plus, et ont besoin d'un tampon de 17 char seulement pour leur stockage, et où elle auraient besoin d'un tampon d'une taille plus grande que BUFSIZ (qui est une constante entière valant au moins 256 selon le standard, et souvent plutôt 1024).
chez moi :
$ ls
data.txt lire1sur2.c
$ cat data.txt
1 2 2 4 8 7 14
2 1 2 4 8 7 14
1 3 2 5 10 6 12
3 1 2 5 10 6 12
3
0
4
0
5
$ cat lire1sur2.c#include <stdio.h> int main(void) { FILE * fich; char st[BUFSIZ]; fich = fopen("data.txt" , "r"); if (fich == NULL) { perror("Error opening file"); return 1; } while(1) { if (fgets(st, 100, fich) != NULL) { printf("j'ai récupéré : %s", st); /* faire ce que tu veux avec la ligne récupérée * en la déchiffrant avec sscanf */ if (fgets (st, 100, fich) == NULL) break; } else { break; } } fclose (fich); return 0; }$ gcc -Wall lire1sur2.c
$ ./a.out
j'ai récupéré : 1 2 2 4 8 7 14
j'ai récupéré : 1 3 2 5 10 6 12
j'ai récupéré : 3
j'ai récupéré : 4
j'ai récupéré : 5
$
affiche correctement une ligne sur deux en commençant avec la première, en utilisant ton jeu de données auquel j'ai rajouté 5 lignes supplémentaires.
Dal
-