#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 ++
если какой-либо орган поможет мне в этом отношении, я был бы очень благодарен
!read.eof()
проверяет только конец файла, а не ошибки чтения файла, такие как не подключенная сетевая файловая система, ошибка диска или отсутствие разрешения на чтение файла. Вы должны проверить все сбои, с while(read)
у которого есть перегруженный оператор, чтобы проверить все за вас. Таким образом, если файл не удается, вы перестаете пытаться читать с него. Вы также должны проверить статус до пытаюсь прочитать из файла. В качестве таких, while(read) { ... }
предпочтительнее цикла do / while. После цикла вы можете выдать предупреждение или ошибку, чтобы пользователь не достиг конца файла !read.eof()
чтобы они могли исследовать этот конкретный файл.
Попытайся избежать char *
а также char []
настолько, насколько это возможно, поскольку это очень подвержено ошибкам. У вас есть символ [100]. Что происходит, если длина строки превышает 100 символов? read >> token
может перезаписать стек — например, повредить ifstream read
,
Рассмотреть возможность использования std::list<sub_node>
чтобы избежать необходимости заново изобретать и повторно отлаживать колесо? Вам больше не понадобится следующий указатель, так как std :: list уже делает это за вас. Это оставило бы намного меньше кода для отладки.
Других решений пока нет …