Remplir une chaine par des lignes d'un fichier

boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 - 11 oct. 2009 à 17:56
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 - 12 oct. 2009 à 23:16
Bonjour,

Je voulais remplir une chaine 's' par des lignes des fichiers.
par exemple si on a le fichiers "test.txt":

aaa
cc
bbbbb
deee


Il aura un espace entre chaque mot dans la chaine 's'.

le résultat souhaité est d'afficher la chaine 's'
'aaa cc bbbbb deee'

Voici mon essai:

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

int main(void)
{
char *s = NULL;
int i 0, cpt 0;
char c;
FILE *fp = fopen("test.txt","r");
rewind(fp);
while((c=fgetc(fp)) != EOF)
cpt++;
s = malloc(sizeof(char) * (cpt+1));
rewind(fp);
while((c=fgetc(fp)) != EOF) {
if(c == '\n') 
s[i++] = ' '; 
else 
s[i++] = c;
}
fclose(fp);
s[i] = '\0';
printf("le resultat est : %s\n",s);
free(s);
return 0;
}


Ce code m'affiche :

<citation>le resultat est :aaa cc bbbbb deee2222</citation>

Mais le résultat souhaité est :
<citation>le resultat est :aaa cc bbbbb deee</citation>

Je ne sais pas comment viennent ces quatre 2 ?

Je crois que chaque chaine de caractère a une marque de fin '\0'.
Quelle est la modification à ajouter ?

De plus on peut optimiser cette solution car on fait deux fois le parcours de fichier. ceci sera couteux si on a fichier avec de centaines lignes. Que pensez vous ?

lorsque on fait une déclaration statique d'une chaine de caractère.
Donc quelle est la taille maximale de chaine à atteindre ?

Dans le cas de déclaration dynamique pas de problème ?

4 réponses

ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
11 oct. 2009 à 23:47
Bonjour,

Pour connaître la taille du fichier sans le parcourir :

file *fp = fopen("test.txt","r");
fseek(fp,0L,SEEK_END);
cpt = ftell(fp);
fseek(fp,0L,SEEK_SET); // ou bien rewind(fp);

Pour les 2222, je ne vois pas.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
12 oct. 2009 à 07:54
Merci beaucoup.

J'ai une autre demande.
Je serais très contente à m'aider.

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
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
12 oct. 2009 à 08:31
pour les 2222 je ne vois qu'une chose : mémoire non initialisée.
fait un memset après le malloc.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
12 oct. 2009 à 23:16
Bonjour,

Comment définir et utiliser 'memset' dans mon programme ?
quelles sont les modifications à faire ?

Merci.
0
Rejoignez-nous