массивы — хотите прочитать более 50000 текстовых файлов и сохранить их в связанном списке в переполнении стека

#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 ++
если какой-либо орган поможет мне в этом отношении, я был бы очень благодарен

-2

Решение

!read.eof() проверяет только конец файла, а не ошибки чтения файла, такие как не подключенная сетевая файловая система, ошибка диска или отсутствие разрешения на чтение файла. Вы должны проверить все сбои, с while(read) у которого есть перегруженный оператор, чтобы проверить все за вас. Таким образом, если файл не удается, вы перестаете пытаться читать с него. Вы также должны проверить статус до пытаюсь прочитать из файла. В качестве таких, while(read) { ... } предпочтительнее цикла do / while. После цикла вы можете выдать предупреждение или ошибку, чтобы пользователь не достиг конца файла !read.eof() чтобы они могли исследовать этот конкретный файл.

Попытайся избежать char * а также char [] настолько, насколько это возможно, поскольку это очень подвержено ошибкам. У вас есть символ [100]. Что происходит, если длина строки превышает 100 символов? read >> token может перезаписать стек — например, повредить ifstream read,

Рассмотреть возможность использования std::list<sub_node> чтобы избежать необходимости заново изобретать и повторно отлаживать колесо? Вам больше не понадобится следующий указатель, так как std :: list уже делает это за вас. Это оставило бы намного меньше кода для отладки.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]