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   -
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:

#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:

4 réponses

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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
1
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Quelques remarques additionnelles :

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.
0
mouna1985 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   3
 
Merci Dal, oui avec sprintf j'ai pu ouvrir mes fichiers (un par un)
0
mouna1985 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   3
 
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
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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 :

	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
0
mouna1985 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   3
 
ça sert à quoi les lignes tel que :

/* remplir les données du 1er fichier */
fichiers_table[0].donnees[0][0] = 1.1;
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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 :

fichiers_table[num_fich - 1].donnees[ligne][col] = valeur_recuperee;

Dal
0
mouna1985 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   3
 
J'ai essayé de récrire mon code comme suit:

#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!!!!
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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 :

		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
0
mouna1985 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   3
 
Merci Dal, Oui j'ai essayé de travail par un seul fichier au début puis incorporer les autres ( comme je suis débutante en C)

Merci infiniment :)
0
mouna1985 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   3
 
re bonsoir dal,

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
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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 :
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
0
mouna1985 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   3
 
oui le problème est que je dois écrire == non pas =
Merciii
0