Traitement simultannée sur des fichiers

boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 - 2 oct. 2009 à 10:14
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 - 19 oct. 2009 à 09:44
Bonjour,

Je voulais faire un traitement en même temps sur un nombre de fichier.J'ai trouvé des difficultés pour résoudre ce problème.

Je vous explique ma demande :
J'ai un fichier nommé "resultat.txt" contenanat deux champs de type chaine de caractère: numero et son attribut.
Soit le fichier "resultat.txt":

5 : dd cc aaa
8 : aaa bb dd
10 : bb cc aaa
4 : dd bb cc



Chaque mot formant le deuxième champ(attribut) présente le nom d'un fichier texte.
Dans notre exemple on a les fichiers textes suivants:
"dd.txt", "cc.txt", "aaa.txt" et "bb.txt".
On peut avoir plus ou moins de ces fichiers textes car ceci dépend des mots formant le deuxième champ (attribut).
Le contenu de ces fichiers existent et ils sont générés dans mon programme. chacun de ces fichiers est formant de deux champs: valeur(de type entier) et degree(de type réel).

Dans cet exemple, on a le contenu :
- de fichier "dd.txt" :

257 0.860000
233 1.000000
144 0.880000
377 0.000000
257 0.860000
562 0.000000
456 0.000000
388 0.660000
644 0.000000
277 0.460000



- de fichier "cc.txt" :
160 1.000000
155 1.000000
160 1.000000
155 1.000000
175 0.000000
185 0.000000
170 0.000000
175 0.000000
174 0.000000
163 0.400000



- de fichier "aaa.txt" :
30 1.000000
32 1.000000
45 1.000000
56 1.000000
46 0.860000
48 0.000000
34 0.000000
38 0.500000
59 0.660000
30 0.000000



- de fichier "bb.txt" :
257 0.860000
233 1.000000
144 0.880000
377 0.000000
257 0.860000
562 0.000000
456 0.000000
388 0.660000
644 0.000000
277 0.460000




Je voulais pour chaque numero (premier champ de fichier "resultat.txt") positionner sur la même ligne numéro 'numero' pour chaque fichier txt correspondant et calculer le minimum entre ces valeurs de 'degree'
par exemple pour le numero 10 de fichier "resultat.txt" nous allons positionner sur la ligne numéro 10 en même temps pour tous les fichiers correspondant à ce numéro.
Pour cet exemple, on va positionner sur la ligne numéro 5 du fichiers "cc.txt", "aaa.txt" et "bb.txt"
puis on cherche le minimum entre les valeurs de 'degree'
Dans notre exemple, on cherche le minimum entre
0.400000 et 0.000000 et 0.460000

Donc on a le minimum est 0.4000000

Et donc on souhaite obtenir le résultat final qui va être stocker dans un fichier nommée "resultat_final" est :

5 : dd cc aaa : 0.50
8 : aaa bb dd : 0.50
10 : bb cc aaa : 0.40
4 : dd bb cc : 1.00



Que proposez vous ?

Merci.

9 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
2 oct. 2009 à 15:18
Salut Asma,

Ton exemple n'est pas claire.

1ere chose : Tu dis prendre la ligne numéro 10, puis la numéro 5 mais les valeurs indiquées ne correspondent pas. Si j'ai bien compris et que je prend la ligne numéro 5 des fichiers dd, cc et aaa j'obtiens :
- 5ieme ligne de dd : 0.860000
- 5ieme ligne de cc : 0.000000
- 5ieme ligne de aaa : 0.860000

Le minimum est donc 0.000000.

2ieme chose : 0.400000 et 0.000000 et 0.460000 => chez moi le minimum c'est 0.000000 et non pas 0.400000 comme tu l'indique dans ton exemple.

Bref, si j'ai bien compris ton problème, la solution n'est pas bien compliqué en place.
Dans un premier temps essaye de mieux nous expliquer ton besoin et de le corriger si necessaire, ensuite nous serons en mesure de mieux t'aider.

Shell
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
2 oct. 2009 à 20:29
Pardon, C'est faute de frappe.

Oui tu est raison.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
5 oct. 2009 à 09:51
Bonjour,

Je vous explique ma demande :
J'ai un fichier nommé "resultat.txt" contenant deux champs de type chaine de caractère: numero et son attribut.
Soit le fichier "resultat.txt":
5 : dd cc aaa
8 : aaa bb dd
10 : bb cc aaa
4 : dd bb cc



Chaque mot formant le deuxième champ(attribut) présente le nom d'un fichier texte.
Dans notre exemple on a les fichiers textes suivants:
"dd.txt", "cc.txt", "aaa.txt" et "bb.txt".
On peut avoir plus ou moins de ces fichiers textes car ceci dépend des mots formant le deuxième champ (attribut).
Le contenu de ces fichiers existent et ils sont générés dans mon programme. chacun de ces fichiers est formant de deux champs: valeur(de type entier) et degree(de type réel).

Dans cet exemple, on a le contenu :
- de fichier "dd.txt" :
257 0.860000
233 1.000000
144 0.880000
377 0.000000
257 0.860000
562 0.000000
456 0.000000
388 0.660000
644 0.000000
277 0.460000


- de fichier "cc.txt" :
160 1.000000
155 1.000000
160 1.000000
155 1.000000
175 0.000000
185 0.000000
170 0.000000
175 0.000000
174 0.000000
163 0.400000


- de fichier "aaa.txt" :
30 1.000000
32 1.000000
45 1.000000
56 1.000000
46 0.860000
48 0.000000
34 0.000000
38 0.500000
59 0.660000
30 0.000000



- de fichier "bb.txt" :
257 0.860000
233 1.000000
144 0.880000
377 0.000000
257 0.860000
562 0.000000
456 0.000000
388 0.660000
644 0.000000
277 0.460000


Je voulais pour chaque numero (premier champ de fichier "resultat.txt") positionner sur la même ligne numéro 'numero' pour chaque fichier txt correspondant et calculer le minimum entre ces valeurs de 'degree'
ppar exemple pour le numero 10 de fichier "resultat.txt" nous allons positionner sur la ligne numéro 10 en même temps pour tous les fichiers correspondant à ce numéro.
Pour cet exemple, on va positionner sur la ligne numéro 10 du fichiers "cc.txt", "aaa.txt" et "bb.txt"
puis on cherche le minimum entre les valeurs de 'degree'
Dans notre exemple, on cherche le minimum entre
0.400000 et 0.000000 et 0.460000

Donc on a le minimum est 0.000000

Et donc on souhaite obtenir le résultat final qui va être stocker dans un fichier nommée "resultat_final" est :

5 : dd cc aaa : 0.00
8 : aaa bb dd : 0.00
10 : bb cc aaa : 0.00
4 : dd bb cc : 0.00


Je n'oublierai pas vos aides car la solution de ma dernière demande signifie fin de mon travail.

Je souhaite que vous acceptez cette demande et me répondez.

Que proposez vous ?

Merci.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
7 oct. 2009 à 17:25
Bonjour,

J'ai trouvé des difficultés au début pour extraire le premier champ et les différents mots de deuxième champ de fichier "resultat.txt" .

Que proposez vous comme solution?

Merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
7 oct. 2009 à 21:07
Salut Asma,

Désolé de ne répondre que maintenant.
Si tu regardes dans mes codes sources tu devrais y trouver quelques chose de similaire a ce que tu souhaites faires.

Si j'ai un peu de temps ce soir je te ferai un petit exemple sur mesure pour t'aider à comprendre.
L'idée est d'utiliser la fonction strtok(...) pour extraire les différentes valeurs de tes fichiers.

Shell
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
11 oct. 2009 à 20:40
Bonsoir,

Je serais très contente si vous m'aidez.

Merci.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
14 oct. 2009 à 08:04
Bonjour,

J'ai besoin de votre solution concernant ma demande car je dois l'utiliser dans mon programme.

Merci.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
15 oct. 2009 à 18:34
Bonjour,

Voici mon essai concernant ma dernière demande:

#include <stdlib.h>
#include <stdio.h>

int readInt(FILE* fp, int *ret)
{
int i;
char sBuffer[32];
for (i=0;i<8;i++)
{
sBuffer[i] = fgetc(fp);
if (sBuffer[i]==32)
{
sBuffer[i] = 0;
*ret = strtol(sBuffer, NULL, 0);
return 0;
}
}

*ret = 0;
return -1;
}

double LireDegree(int nLineNumber, char* sFileName)
{
char sBuffer[32];
FILE* fp;
int i=0;

if (fp = fopen(sFileName, "r")) {
while(--nLineNumber)
while (!feof(fp) && fgetc(fp)!=10);
while (fgetc(fp)!=32);
while(!feof(fp)) {
sBuffer[i] = fgetc(fp);
if (sBuffer[i]==32 || sBuffer[i]==13)
break;
i++;
}
sBuffer[i] = 0;
fclose(fp);
return strtod(sBuffer, NULL);
}
return 0.0;
}

int main()
{
char sBuffer[32];
FILE *fp, *fp_final;
int nLineNumber, i;
double nCurDegree, nMinDegree = 0.0;
int bFirst=1;
int bBreak = 0;

fp = fopen("resultat.txt", "r");
fp_final = fopen("resultat_final.txt", "w");
while (!readInt(fp, &nLineNumber)) {
fprintf(fp_final, "%d :", nLineNumber);
fgetc(fp);
i=0;
while(!feof(fp)) {
sBuffer[i]=fgetc(fp);
if (sBuffer[0]==10)
break;
else if (sBuffer[i]==10 || sBuffer[i]==32 && i!=0) {
bBreak = (sBuffer[i]==10);

sBuffer[i] = 0;
fprintf(fp_final, " %s", sBuffer);

sBuffer[i++] = '.';
sBuffer[i++] = 't';
sBuffer[i++] = 'x';
sBuffer[i++] = 't';
sBuffer[i] = '\0';

nCurDegree = LireDegree(nLineNumber, sBuffer);
if (nMinDegree>nCurDegree || bFirst) 
{
bFirst = 0;
nMinDegree = nCurDegree;
}
i=0;
if (bBreak)
break;
}
else if (sBuffer[0]!=32)
i++;
}
fprintf(fp_final, " : %f\n", nMinDegree);
bFirst = 1;
}
fclose(fp);
fclose(fp_final);

system("type resultat_final.txt");
system("pause");
}



Tout d'abord cette solution donne:

5 : dd cc aaa : 0.000000
8 : aaa bb dd : 0.500000
10 : bb cc aaa : 0.000000
4 : dd bb : 0.000000



Cette résultat obtenue si les différents fichiers ("aaa.txt", "bb.txt", "cc.txt", "dd.txt")textes décrites au dessus ils ont un seul espace entre les deux champs formant chaque fichier.

Mais le résultat souhaité est :

5 : dd cc aaa : 0.00
8 : aaa bb dd : 0.50
10 : bb cc aaa : 0.00
4 : dd bb cc : 0.00




Dans cette résultat, on obtient:

4 : dd bb




Mais elle me manque 'cc'
Or on doit obtenir:

4 : dd bb cc




Or si les différents fichiers ("aaa.txt", "bb.txt", "cc.txt", "dd.txt")textes décrites au dessus ils ont plusieurs espaces pas un seul espace entre les deux champs formant chaque fichier alors je n'obtiens le bon résultat puisque tous les minimum sont égales à 0.000000

Quelles sont les modifications à faire dans cette solution ?


car pour les différents fichiers ("aaa.txt", "bb.txt", "cc.txt", "dd.txt")textes décrites au dessus ils ont plusieurs espaces pas un seul espace entre les deux champs formant chaque fichier. De plus ces fichiers sont générés automatiquement dans le programme.
En réalité, je fais
fprintf(fp,"%10d%s\n",champ1,champ2)
Je dois travailler avec ce format.

Merci.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
19 oct. 2009 à 09:44
Bonjour,


Merci.Bonjour,

Je suis bloquée à ce niveau. La solution à la dernière demande me manque pour l'intégrer dans mon projet final.
S'il vous plait, qu'est ce qu'il manque cette solution pour répondre à la dernière demande ?

Pouvez vous proposez autre solution loin de mon code ?

Je tiens compte pour vos aides et je n'oublierai pas vos efforts.

Merci.
0
Rejoignez-nous