想读取超过50,000个txt文件,并将它们保存在C ++的链表中

时间:2012-09-14 17:56:09

标签: c++ arrays linked-list

#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();
}

我正在开展一个项目,在这个项目中,我必须阅读超过50,000个文本文件来解析它们的单词,并以排序的方式将它们保存在链表中,我已经用C ++编写了代码。它的工作效率非常高但我在这方面有一个问题,就是它不能正确地读取文件有时3000有时4000.我已经搜索了很多但我无法找到我的错。 。这是我在C ++中的代码     如果有任何身体在这方面帮助我,我会非常感激

1 个答案:

答案 0 :(得分:1)

!read.eof()仅检查文件结尾,而不检查读取文件的错误,例如网络安装文件系统未就绪,磁盘错误或缺少读取文件的权限。您应该检查所有失败,while(read)有一个超载的操作员为您检查所有内容。因此,如果文件失败,您将停止尝试从中读取。您还应该在尝试从文件中读取之前检查状态。因此,while(read) { ... }优于do / while循环。在循环之后,您可能会向用户发出警告或错误,指出您没有到达文件末尾!read.eof(),因此他们可以调查该特定文件。

尽可能避免使用char *char [],因为这很容易出错。你有一个char [100]。如果字符串超过100个字符会发生什么? read >> token可能会覆盖堆栈 - 例如损坏ifstream read

考虑使用std::list<sub_node>来避免重新发明和重新调试轮子?你不再需要下一个指针,因为std :: list已经为你做了。这样可以减少调试代码。