2014-06-26 1 views
0

Le but de mon programme est de lire les mots dans un fichier et de compter les occurrences de chaque mot. Voici le code:C++: erreur de segmentation (core dumped)

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

int main() { 
    vector<string> v, vdist; 
    string parola; 
    int j=0; 
    ifstream myfile("example.txt"); 
    if (myfile.is_open()) { 
     cout << "file opened\n"; 
     while (! myfile.eof()) { 
      myfile >> parola; 
      v.push_back(parola); 
     } 
     cout << "dimensione file: " << v.size() << endl; 
     for (int i=0; i< v.size(); i++) { 
      cout << i << " " << v[i] << endl; 
     } 
     sort(v.begin(),v.end()); 
     for (int i=0; i<= v.size()-1; i++) { 
      if (v[i] != v[i+1]) { 
       vdist[j] = v[i]; 
       cout << vdist[j] << endl; 
       j++; 
      } 
      vdist[j]= v[v.size()-1]; 
      j++; 
     } 
    } else 
     cout << "file not opened\n"; 

    return 0; 
} 

Tout ce que je veux faire est de créer un vecteur vdist qui contient tous les mots distincts, et comptant pour chacun l'événement. Évidemment ce n'est pas la meilleure méthode mais c'est juste pour apprendre. La ligne qui génère une erreur de segmentation est la suivante:

vdist[j] = v[i]; 

Pourquoi est-ce qui se passe?

Répondre

4

vdist est vide, donc vdist[j] est hors limites.

Au lieu de cela, il semble que vous voulez pousser la valeur à l'extrémité du vecteur:

vdist.push_back(v[i]); 

Une fois que vous faites ce changement, la variable j sera redondante, vous devez le supprimer.

Vous avez également un problème sur l'itération finale, où v[i+1] est hors limites. Vous devrez corriger cela - peut-être en arrêtant une itération plus tôt, ou peut-être en traitant l'itération finale différemment des autres.

+0

De plus, en règle générale, lorsque vous accédez à un conteneur, assurez-vous que le conteneur existe s'il s'agit d'un pointeur et que l'index n'est pas hors limite. Si le conteneur provient de la stl, vous pouvez utiliser itérateur pour l'itérer, c'est plus sûr. –

+0

yesss !! je suis tellement stupide!! merci beaucoup, maintenant ça marche parfaitement! Merci encore! –

Questions connexes