我正在编程一个双向链表,其中我从给定文件中读取字符串。 因此,我编写了一个名为Node的类,其中存储了一个字符串(读取字)以及字长和其他参数的一些整数。计数列表元素
当我读取所有字符串形成文件后,我打开第二个文件,并再次读出每个单词,并将该单词与链接列表中的字符串进行比较。之后,我将每个找到的单词存储在结果文件中。
现在我想显示找到的词有它的文本位置的用户,例如:
“上找到在thext文件中的200处字”
因此我创建了一个计数器,每创建一个新节点就增加一个计数器。我现在的问题是,我的计数器只是统计了整个创建了多少个节点。所以我只看到创建了大约56000个节点,但我无法存储节点的编号。
我在做什么错?
编辑:我没有尝试减少计数器,因为我从不删除一个节点。 这里是我完整的代码
#include <iostream>
#include <string>
#include <stdio.h>
#include <fstream>
#include <cstring>
using namespace std;
class Word
{
public:
Word (string inputstring = 0, int b = 0, int c = 0, int l = 0, Word *n = 0, Word *p = 0) : word (inputstring), book (b), chapter (c), length (l), next (n), prev (p)
{
++counter;
}
int book;
int chapter;
int length;
string word;
Word *next;
Word *prev;
static size_t howMany()
{
return counter;
}
private:
static size_t counter;
};
size_t Word::counter;
int main()
{
string inputstring = "empty";
string compare = "empty";
int l1 = 0;
int book = 0;
int chapter = 0;
int count = 0;
Word *p = 0;
Word *x = 0;
Word *start = 0;
ifstream file;
file.open("Beispieltext.txt");
ofstream outfile;
if (!file) cout << ("can't open input file");
else cout << "File: Beispieltext.txt open\n";
// create nodes
while (file >> inputstring)
{
l1 = (int)inputstring.length();
if ((!(inputstring[0] >= 'A' && inputstring[0] <= 'Z')) && (!(inputstring[0] >= 'a' && inputstring[0] <= 'z'))) inputstring = inputstring.substr(1,l1--); // l1-- reduce length
while ((!(inputstring[l1-1] >= 'A' && inputstring[l1-1] <= 'Z')) && (!(inputstring[l1-1] >= 'a' && inputstring[l1-1] <= 'z'))) inputstring = inputstring.substr(0,--l1); // --l1 go till n-1
// book?
if (std::strncmp(inputstring.data(), "BOOK", 4) == 0) ++book, chapter = 0/*, cout << "\nBook Nr.: " << book << "\n"*/;
// Chapter?
if (std::strncmp(inputstring.data(), "CHAPTER", 7) == 0) ++chapter/*, cout << "chapter: " << chapter << "\n"*/;
if (p == NULL)
{
p = new Word (inputstring);
} else
{
x = new Word (inputstring, book, chapter, l1, 0, p);
p->next = x;
p = x;
}
}
file.close();
cout << "File: Beispieltext.txt closed!\n";
// n...0
for (; p; p = p->prev) start = p; // go to start
// Open compare file 1
file.open("Suchbegriffe_1.txt");
if (!file) cout << "Can't open compare file!\n";
else cout << "File: Suchbegriffe.txt open!\n";
// Open result file 1
outfile.open("Result_1.txt");
if(!outfile) cout << "Can't open Result_1.txt file!\n";
else cout << "File: Result_1.txt open!\n";
while (file >> compare)
{
l1 = (int)compare.length();
// Search
x = start;
// 0...n go to end
for (; x; x = x->next)
{
if (l1 == x->length)
{
if (compare == x->word)
{
outfile << "Word: " << compare << " found in book Nr.: " << x->book << ", chapter: " << x->chapter << "!\n";
outfile << "Word: " << compare << " is the " << x->howMany() << " Word in the book.\n";
count++;
}
}
}
outfile << "Word: " << compare << ", " << count << "x found!\n";
count = 0;
}
file.close();
cout << "File: Suchbegriffe_1.txt closed!\n";
outfile.close();
cout << "File: Result.txt closed!\n";
// Open compare file 2
file.open("Suchbegriffe_2.txt");
if (!file) cout << "Can't open compare file!\n";
else cout << "File: Suchbegriffe.txt open!\n";
// Open result file 2
outfile.open("Result_2.txt");
if (!outfile) cout << "Can't open Result_2 file!\n";
else cout << "File: Result_2.txt open!\n";
while (file >> compare)
{
l1 = (int)compare.length();
// Search
x = start;
// 0...n go to end
for (; x; x = x->next)
{
if (l1 == x->length)
{
if (compare == x->word)
{
outfile << "Word: " << compare << " found in book Nr.: " << x->book << ", chapter: " << x->chapter << "!\n";
count++;
}
}
}
outfile << "Word: " << compare << ", " << count << "x found!\n";
count = 0;
}
file.close();
cout << "File: Suchbegriffe_2.txt closed!\n";
outfile.close();
cout << "File: Result_2.txt closed!\n";
}
请提供其余的代码(并正确格式化),而不是指望人们填写空格。 – 2014-10-03 10:49:16
你是否试图在析构函数中减少计数器? – Jepessen 2014-10-03 10:49:16
@Jepessen,这不会改变每个节点共享单个全局计数器的事实,因此不可能为每个节点返回不同的ID – 2014-10-03 10:51:42