C ++动态数组输入

时间:2014-01-23 06:25:45

标签: c++ io dynamic-arrays

我使用两个动态数组来读取文件。它们用于跟踪每个单词及其出现的次数。如果它已经出现,我必须在一个数组中保持跟踪,而不是将它添加到另一个数组中,因为它已经存在。但是,当我遇到副本时,我的数组中会出现空格。我认为这是因为我的指针继续前进,但实际上它不应该。我不知道如何打击这个。我唯一的方法是使用继续;当我打印出结果时,如果数组内容="&#34 ;; if (*(words + i) == "") continue;。这基本上忽略了数组中的那些空白。但我觉得这很混乱。我只是想弄清楚如何在这个方法中移回指针。单词和频率是我的动态数组。

我想指导我的问题,而不是解决方案。

我现在已将外部循环更改为while循环,并且仅在找到该单词时才会增加。谢谢WhozCraig和poljpocket。

现在发生这种情况。 enter image description here

5 个答案:

答案 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. 您的算法找到当前单词。它插入阵列的 i 位置。
  2. 您的算法确实找到该字词。单词的频率与i一起递增,只要有一个单词已存在,就会在数组中留下空白条目。
  3. 总而言之,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<>如何使这项任务变得更容易,那么它永远不会。