C++ C++;动态阵列输入

C++ C++;动态阵列输入,c++,io,dynamic-arrays,C++,Io,Dynamic Arrays,我使用两个动态数组来读取文件。他们将跟踪每个单词及其出现的次数。如果它已经出现,我必须在一个数组中跟踪它,而不是将它添加到另一个数组中,因为它已经存在。但是,当我遇到一个重复项时,数组中会出现空白。我想这是因为我的指针继续前进,但实际上它不应该前进。我不知道该如何应对这种情况。我唯一的办法就是使用continue;当我打印出结果时,如果数组内容为“”如果(*(单词+i)==”)继续。这基本上忽略了数组中的空白。但我认为这很混乱。我只是想弄清楚如何在这个方法中把指针移回去。单词和频率是我的动态数组

我使用两个动态数组来读取文件。他们将跟踪每个单词及其出现的次数。如果它已经出现,我必须在一个数组中跟踪它,而不是将它添加到另一个数组中,因为它已经存在。但是,当我遇到一个重复项时,数组中会出现空白。我想这是因为我的指针继续前进,但实际上它不应该前进。我不知道该如何应对这种情况。我唯一的办法就是使用continue;当我打印出结果时,如果数组内容为“”<代码>如果(*(单词+i)==”)继续。这基本上忽略了数组中的空白。但我认为这很混乱。我只是想弄清楚如何在这个方法中把指针移回去。单词和频率是我的动态数组

我想知道我的问题是什么,而不是解决方案

我现在已经将我的外部循环更改为while循环,并且只有在找到单词后才增加。谢谢你,WhozCraig和poljpocket

现在这种情况发生了。
为什么不使用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();
}
void collect(std::string name,std::map&freq){
std::ifstream文件;
open(name.c_str(),std::ifstream::in);
字符串字;
while(true){
文件>>word;//添加到较低版本
如果(file.eof())中断;
频率[字]+;
}
file.close();
}

解决方案的问题是在查找重复项的内部循环中使用count。您将需要另一个变量,例如nocc,最初为0,在内部循环中用作限制,并在添加另一个尚未看到的单词时递增。

签出
SEEK\u CUR()
。如果你想把光标设置为

,问题是逻辑问题,考虑几种情况:

  • 您的算法没有找到当前单词。它被插入阵列的位置i
  • 您的算法不会找到单词。这个词的频率随着i的增加而增加,每当有一个词已经存在时,数组中就会留下空白条目
  • 总而言之,1按预期工作,但2不工作

    我的建议是,不要依赖for循环来遍历字符串,而是使用“get next until end”方法,该方法使用while循环。这样,您就可以跟踪下一个插入点,从而去掉空白项。
    int currentCount = 0;
    while (file)
    {
         // your inner for loop
         if (!found)
         {
             *(words + currentCount) = hold;
             *(frequency + currentCount) = 1;
             currentCount++;
         }
    }
    

    您不需要在每个循环中递增循环变量[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;
     }
    
    intidx=0;
    while(文件>>保持&&idx
    首先,要解决您的代码问题,它可能应该是这样的。请注意,当我们添加单词时,我们只会增加
    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;
            }
        }
    }
    
    void addWords(const std::string&fname,int count,string*words,int*frequency)
    {
    std::ifstream文件(fname);
    字符串保持;
    int i=0;
    而(我>保持))
    {
    int j=0;
    
    对于(;jz正如你所知,我们完全不知道
    单词
    频率
    数组是否被正确分配。你需要仔细查看哪些条目的单词和频率正在随着你使用
    i
    而更新。仔细查看它。在数组的创建中进行编辑。我将了解你的意思现在。@WhozCraig我试图设置I——当发现重复项时,但当我运行时,它似乎不起作用。某个无限循环?也不知道为什么。您错误地将其同时用于插入和循环控制变量。此外,这应该读取整个文件吗(与此相反,刚传入number
    count
    words?@WhozCraig我将再次查看,看看我在哪里出错。这假设是读取整个文件。我所做的是使用一个函数,对之前返回该计数的所有单词进行计数。因此,为动态数组提供了一个合理的初始大小。然后我重新打开文件并执行以下操作。)如果可以的话,addWords.I会的,但是这个程序要使用指针(动态数组)。
    while(!file.eof())是错误的。你会把最后一个单词插入两次。@ WooZravigg谢谢。我应该检查DoC来进行标记化阅读。你也可能想用CurrnCalt检查数组边界。现在这是有意义的。但是,空白空间已经移动到数组的末尾。不知道这是因为你在分配单词量的空间,这不是一个很明显的词。如果我选择这个方法,有没有办法?我理解java的地图。但是,这是为了实践指针,因为我是C++新手。我完全理解你的意思是地图有多好。布兰登现在看了,特别是在之前的代码。增加
    i
    ,这只发生在我们知道之前没有条目匹配的情况下。啊,所以似乎外部for循环是一个糟糕的选择。我应该只在我没有找到单词时增加,这将在while循环中完成。嗯,好吧,我尝试了一下,但它似乎再次创建了空白,但将它们推到arr的末尾是的。对于数组末尾的空格:请看我在回答中的最后一条评论。另外,它现在表示segm
    #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;
    }