Ouvrir plusieurs fichier txt avec C dans une loop

Fermé
mouna1985 Messages postés 31 Date d'inscription dimanche 29 mars 2009 Statut Membre Dernière intervention 13 novembre 2016 - 7 nov. 2012 à 12:33
mouna1985 Messages postés 31 Date d'inscription dimanche 29 mars 2009 Statut Membre Dernière intervention 13 novembre 2016 - 9 nov. 2012 à 14:46
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
7 nov. 2012 à 14:15
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
7 nov. 2012 à 14:25
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 dimanche 29 mars 2009 Statut Membre Dernière intervention 13 novembre 2016 3
8 nov. 2012 à 00:00
Merci Dal, oui avec sprintf j'ai pu ouvrir mes fichiers (un par un)
0
mouna1985 Messages postés 31 Date d'inscription dimanche 29 mars 2009 Statut Membre Dernière intervention 13 novembre 2016 3
8 nov. 2012 à 00:03
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
8 nov. 2012 à 10:39
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 dimanche 29 mars 2009 Statut Membre Dernière intervention 13 novembre 2016 3
8 nov. 2012 à 11:45
ç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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 8/11/2012 à 12:37
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 dimanche 29 mars 2009 Statut Membre Dernière intervention 13 novembre 2016 3
8 nov. 2012 à 12:37
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 8/11/2012 à 13:24
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 dimanche 29 mars 2009 Statut Membre Dernière intervention 13 novembre 2016 3
8 nov. 2012 à 13:28
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 dimanche 29 mars 2009 Statut Membre Dernière intervention 13 novembre 2016 3
Modifié par mouna1985 le 8/11/2012 à 22:32
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 9/11/2012 à 10:11
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 dimanche 29 mars 2009 Statut Membre Dernière intervention 13 novembre 2016 3
9 nov. 2012 à 14:46
oui le problème est que je dois écrire == non pas =
Merciii
0