Problème à l'affichage dans fichier

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

Problème à l'affichage dans fichier

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 !



Avatar de l’utilisateur
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 :)

Avatar de l’utilisateur
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 !

Avatar de l’utilisateur
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 :)

Avatar de l’utilisateur
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.

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite