Lire des chiffres à partir d'un fichier texte

Fermé
sonya - 14 avril 2017 à 21:55
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 18 avril 2017 à 09:24
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.
A voir également:

1 réponse

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 15 avril 2017 à 00:41
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 avec
sscanf()
, pour les mettre dans tes structures de données.

http://www.cplusplus.com/reference/cstdio/sscanf/

Dal
0
Merci pour votre réponse.
J'ai testé ce code, et afficher les chaines qu'il a récupéré avant de les manipuler avec sscanf mais je trouve qu'il m'affiche les lignes désordonnées.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
18 avril 2017 à 09:24
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
0