我使用两个动态数组来读取文件。它们用于跟踪每个单词及其出现的次数。如果它已经出现,我必须在一个数组中保持跟踪,而不是将它添加到另一个数组中,因为它已经存在。但是,当我遇到副本时,我的数组中会出现空格。我认为这是因为我的指针继续前进,但实际上它不应该。我不知道如何打击这个。我唯一的方法是使用继续;当我打印出结果时,如果数组内容="&#34 ;; if (*(words + i) == "") continue;
。这基本上忽略了数组中的那些空白。但我觉得这很混乱。我只是想弄清楚如何在这个方法中移回指针。单词和频率是我的动态数组。
我想指导我的问题,而不是解决方案。
我现在已将外部循环更改为while循环,并且仅在找到该单词时才会增加。谢谢WhozCraig和poljpocket。
现在发生这种情况。
答案 0 :(得分:1)
不是在每个循环中递增循环变量[i],而只需在找到新单词时递增它[即没有一个已经在数组中的单词]。
此外,你通过循环整个单词数组在内循环中浪费时间,因为单词只存在于索引i。
int idx = 0;
while (file >> hold && idx < count) {
if (!valid_word(hold)) {
continue;
}
// You don't need to check past idx because you
// only have <idx> words so far.
for (int i = 0; i < idx; i++) {
if (toLower(words[i]) == toLower(hold)) {
frequency[i]++;
isFound = true;
break;
}
}
if (!isFound) {
words[idx] = hold;
frequency[idx] = 1;
idx++;
}
isFound = false;
}
答案 1 :(得分:0)
为什么不使用std :: map?
void collect( std::string name, std::map<std::string,int> & freq ){
std::ifstream file;
file.open(name.c_str(), std::ifstream::in );
std::string word;
while( true ){
file >> word; // add toLower
if( file.eof() ) break;
freq[word]++;
}
file.close();
}
您的解决方案的问题是在内部循环中使用count来查找重复项。你需要另一个变量,比如nocc,最初为0,在内循环中用作限制,并且每当你添加另一个尚未看到的单词时都会增加。
答案 2 :(得分:0)
结帐SEEK_CUR()
。如果要将光标设置回
答案 3 :(得分:0)
问题是合乎逻辑的,请考虑以下几种情况:
总而言之,1个按预期工作,但2个没有。
我的建议是你不依赖for循环来遍历字符串,而是使用一个使用while循环的“get-next-until-end”方法。这样,您就可以跟踪下一个插入点,从而删除空白条目。
int currentCount = 0;
while (file)
{
// your inner for loop
if (!found)
{
*(words + currentCount) = hold;
*(frequency + currentCount) = 1;
currentCount++;
}
}
答案 4 :(得分:0)
首先,要解决您的代码,这应该是它应该是什么样子。请注意我们只在添加单词时增加i
,并且我们只扫描我们已为重复添加的单词。另请注意第一遍将如何完全跳过j循环,并简单地插入频率为1的第一个单词。
void addWords(const std::string& fname, int count, string *words, int *frequency)
{
std::ifstream file(fname);
std::string hold;
int i = 0;
while (i < count && (file >> hold))
{
int j = 0;
for (; j<i; ++j)
{
if (toLower(words[j]) == toLower(hold))
{
// found a duplicate at j
++frequency[j];
break;
}
}
if (j == i)
{
// didn't find a duplicate
words[i] = hold;
frequency[i] = 1;
++i;
}
}
}
其次,要真正解决您的代码问题,这应该是实际上的样子:
#include <iostream>
#include <fstream>
#include <map>
#include <string>
//
// Your implementation of toLower() goes here.
//
typedef std::map<std::string, unsigned int> WordMap;
WordMap addWords(const std::string& fname)
{
WordMap words;
std::ifstream inf(fname);
std::string word;
while (inf >> word)
++words[toLower(word)];
return words;
}
如果现在不明显std::map<>
如何使这项任务变得更容易,那么它永远不会。