c++ - source - vider une liste chainée en c



voulez lire plus de 50 000 fichiers txt et les enregistrer dans une liste chaînée en C++ (1)

#include<iostream>
#include<windows.h>
#include<string>
#include<fstream>
using namespace std;
class linklist     //linked list class
{
    struct main_node;
    struct sub_node;

    struct main_node   // main node that only have head pointers in it
    {
        sub_node *head;
        main_node()
        {   head=NULL;  }
    };
    main_node array[26];
    struct sub_node
    {
        double frequency;
        string word;
        sub_node *next;
        sub_node()
        {   frequency=1;    word="";    next=NULL;  }
    };

public:
    void add_node(string phrase)
    {
        char alphabat1=phrase[0];
        if(isupper(alphabat1))
        {
            alphabat1=tolower(alphabat1);
        }
        if(!isalpha(alphabat1))
            return;

        sub_node*temp = new sub_node;
        temp->word = phrase;

        sub_node*current = array[alphabat1-97].head;

        if(current == NULL)
        array[alphabat1-97].head = temp;

        else
        {
            while(current -> next != NULL && phrase != current-> word)
            {   current= current->next; }

            if(current->word == phrase)
                current->frequency++;
            else
                current->next  = temp; //adding words to linklist
        }
    }

    void display()
    {
        for(int i=0;i<26;i++)
        {
        sub_node *temp=array[i].head;
        cout<<char(i+97)<<" -> ";
        while(temp!=NULL)
        {
            cout<<temp->word<<" ("<<temp->frequency<<")  ";
            temp=temp->next;
        }
        cout<<"\n";
        }
    }
void parsing_documents(char *path)
{
    char token[100];
    ifstream read;
    read.open(path);
    do
    {
        read>>token;    // parsing words
        add_node(token);    //sending words to linked list

    }
    while(!read.eof());
        read.clear();
        read.close();
}
void reading_directory()
{
 // code to read multiple files

   HANDLE          hFile;                // Handle to file
   WIN32_FIND_DATA FileInformation;      // File information
   char tempPattern[90];
   strcpy(tempPattern,"*.txt");
   hFile = ::FindFirstFile(tempPattern, &FileInformation);
   long count=0;
   if(hFile != INVALID_HANDLE_VALUE)
   {
        do
        {
            count++;
            cout<<"."<<count;
            this->parsing_documents( FileInformation.cFileName);
        }
        while(TRUE == ::FindNextFile(hFile, &FileInformation));
   } 
    ::FindClose(hFile);

}
};
void main()
{
    linklist member;
    member.reading_directory();
    member.display();
}

Je travaille sur un projet dans lequel je dois lire plus de 50 000 fichiers texte analyser leurs mots et les enregistrer dans une liste liée d'une manière triée, j'ai fait le code en C ++. ça fonctionne assez bien mais j'ai un problème à ce sujet qu'il ne lit pas correctement les fichiers parfois 3000 parfois 4000. Je l'ai beaucoup cherché mais je n'arrivais pas à trouver ma faute. . voici mon code en C ++ si n'importe quel corps m'aide à cet égard je serais très reconnaissant


!read.eof() ne vérifie que la fin du fichier, pas les erreurs de lecture du fichier, telles qu'un système de fichiers monté en réseau n'étant pas prêt, une erreur de disque ou l'absence d'autorisation pour lire le fichier. Vous devriez vérifier tous les échecs, avec while(read) qui a un opérateur surchargé pour vérifier tout pour vous. Donc, si le fichier échoue, vous arrêtez d'essayer d'en lire. Vous devriez également vérifier l'état avant d' essayer de lire dans le fichier. En tant que tel, while(read) { ... } est préférable à la boucle do / while. Après la boucle, vous pouvez émettre un avertissement ou une erreur à l'utilisateur de vous n'avez pas atteint la fin du fichier !read.eof() afin qu'ils puissent enquêter sur ce fichier spécifique.

Essayez d'éviter autant que possible les caractères char * et char [] car il y a beaucoup d'erreurs. Vous avez un char [100]. Que se passe-t-il si la chaîne contient plus de 100 caractères? read >> token peut remplacer la pile - de manière à endommager la ifstream read .

Pensez à utiliser std::list<sub_node> pour éviter d'avoir à réinventer et re-déboguer la roue? Vous n'auriez plus besoin du pointeur suivant car std :: list le fait déjà pour vous. Cela laisserait beaucoup moins de code à déboguer.





linked-list