Problème à l'affichage dans fichier
Discutez d'informatique ici !
-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 18 Fév 2014, 19:45
Le but du sous programme est de lire un fichier constitué d'un mot sur chaque ligne; puis de recopier dans un fichier annexe les mots suivi de leur fréquence d'apparition.
Je vous explique
Admettons un fichier de base
mot1
mot2
mot3
mot1
Le fichier final devra contenir
mot1 2
mot2 1
mot3 1
Cependant j'obtiens quelque chose du genre
mot1
2
mot2
1
mot3
1
mot1
2
La fréquence ne s'affiche pas sur la même ligne; ce qui n'est pas logique d'après mon affichage.
Par ailleurs, les répétitions de mots continuent de s'afficher; pourtant il me semble que j'ai fait une boucle spécialement pour ça.
Voilà le code
- Code: Tout sélectionner
void frequenceMot(FILE *f)
{
f=fopen("rep.txt","r");
char chaine[TAILLE_MAX]="";
char chaine2[TAILLE_MAX]="";
char* tabMot[TAILLE_MAX]={""};
if(f != NULL)
{
int k=0;
while (fgets(chaine, TAILLE_MAX, f) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
{
tabMot[k]=malloc((TAILLE_MAX+1)*sizeof(char));
if (tabMot[k]==NULL)
{
fprintf(stderr, "Erreur calloc\n");
exit(1);
}
strcpy(tabMot[k],chaine); //on stocke les mots du fichier de base
k++;
}
int taille=k;
FILE* f2=NULL;
f2=fopen("classeur.txt","w+");
if(f2 != NULL)
{
int k2;
for(k2=0;k2<taille;k2++)
{
int frequence=0;
int dejaEcrit=0;
int k3;
int res=-1;
for(k3=0;k3<taille;k3++)
{
res=strcmp(tabMot[k2],tabMot[k3]);
if(res==0) //si mots semblable fréquence augmente
{
frequence++;
}
}
while (fgets(chaine2, TAILLE_MAX, f2) != NULL) // On lit le fichier que l'on écrit
{
if(strcmp(fgets(chaine2, TAILLE_MAX, f2),tabMot[k2])==0) //si le mot est déjà écrit
{
dejaEcrit=1;
}
}
if(dejaEcrit==0) // si le mot n'est pas déjà écrit dans le fichier.
{
fprintf(f2, "%s %d\n",tabMot[k2],frequence);
}
}
}
fclose(f2);
}
fclose(f);
}
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
fatal_error
- Membre Légendaire
- Messages: 6610
- Enregistré le: 22 Nov 2007, 12:00
-
par fatal_error » 18 Fév 2014, 21:22
ca t'avancera pas, mais
- Code: Tout sélectionner
var fName = process.argv.splice(2)[0];
console.log(fName);
require('fs').readFile(fName,function(err,data){
var wordMap={};
data.toString().split(/[^\w]/).forEach(function(word){
if(word.length){
word in wordMap?wordMap[word]++:wordMap[word]=1;
}
});
for(word in wordMap){
console.log(word+':'+wordMap[word]);
}
});
344 caracteres...
compressé, 220 :we:
- Code: Tout sélectionner
var f=process.argv.splice(2)[0];console.log(f);require('fs').readFile(f,function(b,c){var d={};c.toString().split(/[^\w]/).forEach(function(a){if(a.length){a in d?d[a]++:d[a]=1}});for(w in d){console.log(w+':'+d[w])}});
pendant que j'y suis 117 en shell
- Code: Tout sélectionner
#!/bin/sh
echo "$1" && grep -oE "\w+" "$1"|sort > a
for i in $(uniq a);do
echo $i":"$(grep -E "^$i$" a|wc -l)
done
la vie est une fête

-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 18 Fév 2014, 21:35
ca t'avancera pas
Bien vu =)
Plus sérieusement s'il y avait un message caché derrière ce code je l'ai pas compris --'
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
fatal_error
- Membre Légendaire
- Messages: 6610
- Enregistré le: 22 Nov 2007, 12:00
-
par fatal_error » 18 Fév 2014, 21:48
ya pas tellement de message caché, simplement qu'à première vue, déjà C c'est overkill, puis en plus ca fait beaucoup de lignes alors qu'on peut s'en sortir sans trop suer..
la vie est une fête

-
Rockleader
- Habitué(e)
- Messages: 2126
- Enregistré le: 11 Oct 2011, 18:42
-
par Rockleader » 18 Fév 2014, 22:11
Je suis bien conscient qu'il y a d'autres méthodes plus simples avec d'autres langages =)
Mais pour le coup là je vois pas...fin je pourrais toujours passer par le shell avec des appels systèmes; mais c'est pas ce qui est attendu ici =)
J'ai surement pas un algo très performant je te l'accorde :d
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !
-
sylvainc2
- Membre Naturel
- Messages: 69
- Enregistré le: 12 Aoû 2012, 18:22
-
par sylvainc2 » 19 Fév 2014, 01:42
La fonction fgets(chaine, TAILLE_MAX, f) lit une ligne et inclut le caractère '\n' dans 'chaine', ce qui fait que, quand tu écris dans le fichier, le '\n' est aussi inclus. Donc tu dois l'enlever avant d'écrire.
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités