我目前正在尝试计算文件中的字数。在此之后,我计划计算文件中两个单词之间的单词。例如。我的文件可能包含。 “你好,我的名字是詹姆斯”。我想计算单词,所以5.然后我想计算“你好”和“詹姆斯”之间的单词数,所以答案是3.我在完成这两项任务时遇到了麻烦。 主要是由于不完全确定如何构造我的代码。 这里的任何帮助将不胜感激。我目前使用的代码是使用空格来计算单词。
这是我的代码:
readwords.cpp
string ReadWords::getNextWord()
{
bool pWord = false;
char c;
while((c = wordfile.get()) !=EOF)
{
if (!(isspace(c)))
{
nextword.append(1, c);
}
return nextword;
}
}
bool ReadWords::isNextWord()
{
if(!wordfile.eof())
{
return true;
}
else
{
return false;
}
}
的main.cpp
main()
{
int count = 0;
ReadWords rw("hamlet.txt");
while(rw.isNextWord()){
rw.getNextWord();
count++;
}
cout << count;
rw.close();
}
它目前所做的是计算字符数。我敢肯定它只是一个简单的修复和愚蠢的东西,我想念。但我一直在努力寻找一些帮助。
非常感谢任何帮助。 :)
答案 0 :(得分:1)
要算:
std::ifstream infile("hamlet.txt");
std::size_t count = 0;
for (std::string word; infile >> word; ++count) { }
仅在开始和结束之间计数:
std::ifstream infile("hamlet.txt");
std::size_t count = 0;
bool active = false;
for (std::string word; infile >> word; )
{
if (!active && word == "Hello") { active = true; }
if (!active) continue;
if (word == "James") break;
++count;
}
答案 1 :(得分:1)
您可以简单地使用istream::operator<<()
来读取以空格分隔的单词,而不是逐个字符地解析文件。 <<
返回流,当仍然可以读取流时,该流的值为true
{/ 1}}。
bool
使用vector<string> words;
string word;
while (wordfile >> word)
words.push_back(word);
和<iterator>
实用程序有一个共同的表述,它更详细,但可以与其他迭代器算法组合:
<algorithm>
然后你就拥有了多少单词,并且可以随心所欲地使用它们:
istream_iterator<string> input(wordfile), end;
copy(input, end, back_inserter(words));
如果您想查找words.size()
和"Hello"
,请使用"James"
标题中的find()
来获取其位置的迭代器:
<algorithm>
如果它们不在向量中,// Find "Hello" anywhere in 'words'.
const auto hello = find(words.begin(), words.end(), "Hello");
// Find "James" anywhere after 'hello' in 'words'.
const auto james = find(hello, words.end(), "James");
将返回find()
;为了说明的目的而忽略错误检查,您可以通过取差异来计算它们之间的单词数,并调整范围中包含words.end()
:
"Hello"
您可以在此处使用const auto count = james - (hello + 1);
,因为operator-()
是“随机访问迭代器”。更一般地说,您可以使用std::vector::iterator
中的std::distance()
:
<iterator>
其优点是更能描述您实际在做什么。此外,为了将来参考,这种代码:
const auto count = distance(hello, james) - 1;
可以简化为:
bool f() {
if (x) {
return true;
} else {
return false;
}
}
由于bool f() {
return x;
}
已将x
转换为bool
。
答案 2 :(得分:0)
我认为“返回下一个字”;应该改为“else return nextword”;或者你每次都从函数getNextWord返回,无论char是什么。
string ReadWords::getNextWord()
{
bool pWord = false;
char c;
while((c = wordfile.get()) !=EOF)
{
if (!(isspace(c)))
{
nextword.append(1, c);
}
else return nextword;//only returns on a space
}
}
答案 3 :(得分:0)
计算所有单词:
std::ifstream f("hamlet.txt");
std::cout << std::distance (std::istream_iterator<std::string>(f),
std::istream_iterator<std::string>()) << '\n';
在两个单词之间计算:
std::ifstream f("hamlet.txt");
std::istream_iterator<std::string> it(f), end;
int count = 0;
while (std::find(it, end, "Hello") != end)
while (++it != end && *it != "James")
++count;
std::cout << count;
答案 4 :(得分:0)
试试这个: 在线下
nextword.append(1, c);
添加
continue;