我正在开发一个c ++程序,该程序应该最终使用散列从文件读入的一段单词创建一个交叉引用表。现在我主要是在读取文件的输入并确保散列函数正常工作。
这里有一些关于这部分问题的具体细节:
该程序应该一次从一个文件中读取一个段落,直到它到达一个单词"由10" *"组成。在* s的这一行之下是稍后将用于测试程序的几行单词。
根据我编写的代码,一切似乎都正常工作(我已经使用公式来计算几个单词的索引,并得到与显示的相同的答案),但是,我和#39;我不确定当我到达10 * s的线时如何让输入停止。因此,虽然这似乎是正确读取文件并执行正确的计算,但它正在为文件中的每个单词执行这些计算。
以下是我编写的代码:
#include <iostream>
#include <fstream>
using namespace std;
int hash(string word) {
int firstOff = word[0];
int lastOff = word[word.size() - 1];
int index = (firstOff * 256 + lastOff) % 23;
cout << index << endl;
return index;
}
int main() {
ifstream file;
file.open("prog7.dat");
if(!file.is_open()) {
cerr << "Error opening " << file << endl;
}
string word;
while(file >> word) {
hash(word);
}
}
这是我得到的输出:
12
6
17
21
1
21
12
14
11
12
7
14
16
10
2
22
19
21
22
7
7
12
21
21
3
9
3
12
14
14
0
3
21
7
6
7
12
7
17
6
2
16
21
7
14
如果有帮助,请点击我用于输入的文件:
the relative lack of acceptance
of these products in the
corporate marketplace is
due less to technical than
to political factors the
availability of this technology
threatens the perks privileges
and traditions of corporate
management
**********
the
political
lack
relative
less
forgive
tradition
factors
more
任何人都可以帮助我吗?我真的很感激。
答案 0 :(得分:2)
您可以在while条件中检查单词:
while(file >> word && word != "**********") {
hash(word);
}
当你到达单词时,你也可以break
循环(如果你喜欢它的外观)。
while(file >> word) {
if (word == "**********") break;
hash(word);
}
答案 1 :(得分:1)
还可以使用istream_iterator
,例如
#include <iostream>
#include <string>
#include <iterator>
#include <fstream>
using namespace std;
int main()
{
ifstream file("prog7.dat");
istream_iterator<string> it(file);
while(*it != "**********")
hash(*it++);
}