Ouvrir plusieurs fichier txt avec C dans une loop
mouna1985
Messages postés
31
Date d'inscription
Statut
Membre
Dernière intervention
-
mouna1985 Messages postés 31 Date d'inscription Statut Membre Dernière intervention -
mouna1985 Messages postés 31 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis entrain de chercher comment définir une boucle for pour ouvrir 10 fichiers texte dans un même programme. Le nom de ces fichiers est sous la forme suivante data1, date2,.. data10.
Je suis débutante en C et ce que je suis habitué à faire est de lire un seule fichier tel le programme ci-dessous:
Pouvez vous m'aider à résoudre mon problème.
Merci d'avance
Je suis entrain de chercher comment définir une boucle for pour ouvrir 10 fichiers texte dans un même programme. Le nom de ces fichiers est sous la forme suivante data1, date2,.. data10.
Je suis débutante en C et ce que je suis habitué à faire est de lire un seule fichier tel le programme ci-dessous:
#include <stdio.h> #include <stdlib.h> #include <string.h> void main () { FILE *fichier1; fichier1=fopen("data.txt","r"); if (fichier1==NULL) perror ("Error opening file"); else { printf("the file is ready \n"); fclose(fichier1); } }
Pouvez vous m'aider à résoudre mon problème.
Merci d'avance
A voir également:
- Ouvrir plusieurs fichier txt avec C dans une loop
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir fichier .bin - Guide
- Ouvrir fichier .dat - Guide
- Comment ouvrir un fichier docx ? - Guide
- Comment ouvrir un fichier 7z - Guide
4 réponses
Salut mouna1985,
Si les 10 fichiers n'ont pas besoin d'être ouverts simultanément, tu peux utiliser la même variable de descripteur de fichier, pour contenir le pointeur renvoyé par fopen dans ta boucle for, en fermant le fichier avant l'itération suivante.
Tu peux constituer le nom du fichier à ouvrir avec sprintf, par exemple.
Dal
Si les 10 fichiers n'ont pas besoin d'être ouverts simultanément, tu peux utiliser la même variable de descripteur de fichier, pour contenir le pointeur renvoyé par fopen dans ta boucle for, en fermant le fichier avant l'itération suivante.
Tu peux constituer le nom du fichier à ouvrir avec sprintf, par exemple.
Dal
Et si j'ai besoin d'appeler les valeurs contenu dans l'un des fichier que je dois utiliser comme commande?
PS: chaque fichier contient 10 lignes et 3 colonnes ( réelle)
et je veux utiliser ces valeurs pour réaliser des fonctions mathématiques
par exemple fichier[1][1]*fichier[1][2]
Merci d'avance
PS: chaque fichier contient 10 lignes et 3 colonnes ( réelle)
et je veux utiliser ces valeurs pour réaliser des fonctions mathématiques
par exemple fichier[1][1]*fichier[1][2]
Merci d'avance
Si tu dois faire des opérations avec des données provenant d'un même fichier, tu peux te contenter d'un seul tableau à deux dimensions, faire tes opérations fichier par fichier et réutiliser la même variable de tableau pour mettre les données du fichier suivant et les traiter.
Si les opérations peuvent impliquer des données provenant de fichiers différents, tu auras sans doutes à charger toutes les données.
Une façon de procéder peut être de faire quelque chose comme cela, comme tes données ont une structure fixe et qu'elles ne sont pas si volumineuses :
Tu initialises les données de fichiers_table[0] à fichiers_table[9] dans ta boucle (là c'est juste pour l'exemple).
Dal
Si les opérations peuvent impliquer des données provenant de fichiers différents, tu auras sans doutes à charger toutes les données.
Une façon de procéder peut être de faire quelque chose comme cela, comme tes données ont une structure fixe et qu'elles ne sont pas si volumineuses :
struct fichier { float donnees[10][3]; }; struct fichier fichiers_table[10]; /* remplir les données du 1er fichier */ fichiers_table[0].donnees[0][0] = 1.1; /* etc., remplir 2ème */ fichiers_table[1].donnees[9][2] = 2.3; /* etc., puis faire des opérations */ float operation = fichiers_table[0].donnees[0][0] * fichiers_table[1].donnees[9][2];
Tu initialises les données de fichiers_table[0] à fichiers_table[9] dans ta boucle (là c'est juste pour l'exemple).
Dal
C'est un exemple d'initialisation d'une valeur du tableau de structures à une dimension qui comprend lui même un tableau à deux dimensions.
Lorsque tu lis les nombres réels provenant de tes fichiers, tu peux les ranger dans l'ordre dans cette structure de données.
Si tu as une boucle for avec num_fich allant de 1 à 10, et que tu parcours les données du fichier en récupérant chaque valeur par ligne (de 0 à 9) et par colonne (de 0 à 2), tu fais ceci :
Dal
Lorsque tu lis les nombres réels provenant de tes fichiers, tu peux les ranger dans l'ordre dans cette structure de données.
Si tu as une boucle for avec num_fich allant de 1 à 10, et que tu parcours les données du fichier en récupérant chaque valeur par ligne (de 0 à 9) et par colonne (de 0 à 2), tu fais ceci :
fichiers_table[num_fich - 1].donnees[ligne][col] = valeur_recuperee;
Dal
J'ai essayé de récrire mon code comme suit:
Le résultats qui s'affiche est:
the input data is ready
N1 = 0.000000
N2 = 0.000000
N3 = 0.000000
0.000000
par contre les valeurs de N1 , N2 et N3 sont différentes de 0!!!!
#include <stdio.h> #include <stdlib.h> #include <string.h> struct input_data { float data[3][3]; }; struct input_data input_data_tab[3] ; int main(void) { FILE *input_data; float operation; input_data=fopen("DONNEE.txt","r"); if (input_data==NULL) { printf("the input data is not ready \n"); } else { printf("the input data is ready \n"); fscanf(input_data,"%.6f",input_data_tab[0].data[0][0]); printf("N1 = %.6f \n",input_data_tab[0].data[0][0]); fscanf(input_data,"%.6f",input_data_tab[1].data[1][0]); printf("N2 = %.6f \n",input_data_tab[1].data[0][0]); fscanf(input_data,"%.6f",input_data_tab[2].data[2][0]); printf("N3 = %.6f \n",input_data_tab[2].data[0][0]); operation = input_data_tab[0].data[0][0]+input_data_tab[1].data[1][0]+input_data_tab[2].data[2][0]; printf("%.6f \n",operation); system("PAUSE"); fclose(input_data); } return 0; }
Le résultats qui s'affiche est:
the input data is ready
N1 = 0.000000
N2 = 0.000000
N3 = 0.000000
0.000000
par contre les valeurs de N1 , N2 et N3 sont différentes de 0!!!!
Il n'y a pas le code d'ouverture des fichiers data1.txt, data2.txt, etc., data10.txt. Est-ce normal ?
Tu n'ouvres qu'un seul fichier DONNEE.txt, alors que tu affectes des indices de tableau différents à input_data_tab[i]. Le tableau dans la structure contient [ligne][col], pas l'inverse, et tes printf ne correspondent pas tous aux fscanf.
Dans ton fscanf, que veux tu dire avec %.6f ?
http://www.cplusplus.com/reference/cstdio/fscanf/
fscanf nécessite un pointeur, tu dois donc préfixer l'emplacement dans le tableau où tu veux ranger la donnée avec &.
En tout état de cause, le code devrait être comme ceci par rapport à ce que tu écris dans ton nouveau message :
Mais, en l'état, le code ne parcours que les 3 premières données d'un seul fichier.
Dal
Tu n'ouvres qu'un seul fichier DONNEE.txt, alors que tu affectes des indices de tableau différents à input_data_tab[i]. Le tableau dans la structure contient [ligne][col], pas l'inverse, et tes printf ne correspondent pas tous aux fscanf.
Dans ton fscanf, que veux tu dire avec %.6f ?
http://www.cplusplus.com/reference/cstdio/fscanf/
fscanf nécessite un pointeur, tu dois donc préfixer l'emplacement dans le tableau où tu veux ranger la donnée avec &.
En tout état de cause, le code devrait être comme ceci par rapport à ce que tu écris dans ton nouveau message :
fscanf(input_data, "%f", &input_data_tab[0].data[0][0]); printf("N1 = %.6f \n", input_data_tab[0].data[0][0]); fscanf(input_data, "%f", &input_data_tab[0].data[0][1]); printf("N2 = %.6f \n", input_data_tab[0].data[0][1]); fscanf(input_data, "%f", &input_data_tab[0].data[0][2]); printf("N3 = %.6f \n", input_data_tab[0].data[0][2]); operation = input_data_tab[0].data[0][0] + input_data_tab[0].data[0][1] + input_data_tab[0].data[0][2]; printf("%.6f \n", operation);
Mais, en l'état, le code ne parcours que les 3 premières données d'un seul fichier.
Dal
re bonsoir dal,
J'ai essayé de faire un test sur mes valeurs sauvegardé dans le fichier avec la ligne suivante:
Mais il m'affiche toute les valeurs de input_data_tab[0].data[0][i])
Comment je peux résoudre ce problème?
Merci encore une fois
J'ai essayé de faire un test sur mes valeurs sauvegardé dans le fichier avec la ligne suivante:
for (i=0; i<10; i++) { if(input_data_tab[1].data[1][0] = 1) { printf("Number of inductor = %.f \n", input_data_tab[0].data[0][i]); } }
Mais il m'affiche toute les valeurs de input_data_tab[0].data[0][i])
Comment je peux résoudre ce problème?
Merci encore une fois
Je ne comprend pas très bien ce que tu veux faire.
Cela dit, c'est normal que le "if" soit toujours exécuté car tu fais :
et non pas :
En C, l'opérateur de comparaison d'égalité est ==
En faisant =, tu affectes 1 à la variable contenue dans le if, dont le résultat est donc évalué à 1 par if, or toute valeur autre que 0 en C signifie "vrai".
Dal
Cela dit, c'est normal que le "if" soit toujours exécuté car tu fais :
if(input_data_tab[1].data[1][0] = 1)
et non pas :
if(input_data_tab[1].data[1][0] == 1)
En C, l'opérateur de comparaison d'égalité est ==
En faisant =, tu affectes 1 à la variable contenue dans le if, dont le résultat est donc évalué à 1 par if, or toute valeur autre que 0 en C signifie "vrai".
Dal
int main(void) est mieux, en faisant return 0; à la fin.
Comme cela, tu pourra retourner EXIT_FAILURE si la lecture échoue, en plus du perror.