C++ C++;动态阵列输入
我使用两个动态数组来读取文件。他们将跟踪每个单词及其出现的次数。如果它已经出现,我必须在一个数组中跟踪它,而不是将它添加到另一个数组中,因为它已经存在。但是,当我遇到一个重复项时,数组中会出现空白。我想这是因为我的指针继续前进,但实际上它不应该前进。我不知道该如何应对这种情况。我唯一的办法就是使用continue;当我打印出结果时,如果数组内容为“”<代码>如果(*(单词+i)==”)继续代码>。这基本上忽略了数组中的空白。但我认为这很混乱。我只是想弄清楚如何在这个方法中把指针移回去。单词和频率是我的动态数组 我想知道我的问题是什么,而不是解决方案 我现在已经将我的外部循环更改为while循环,并且只有在找到单词后才增加。谢谢你,WhozCraig和poljpocket 现在这种情况发生了。C++ C++;动态阵列输入,c++,io,dynamic-arrays,C++,Io,Dynamic Arrays,我使用两个动态数组来读取文件。他们将跟踪每个单词及其出现的次数。如果它已经出现,我必须在一个数组中跟踪它,而不是将它添加到另一个数组中,因为它已经存在。但是,当我遇到一个重复项时,数组中会出现空白。我想这是因为我的指针继续前进,但实际上它不应该前进。我不知道该如何应对这种情况。我唯一的办法就是使用continue;当我打印出结果时,如果数组内容为“”如果(*(单词+i)==”)继续。这基本上忽略了数组中的空白。但我认为这很混乱。我只是想弄清楚如何在这个方法中把指针移回去。单词和频率是我的动态数组
为什么不使用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()
。如果你想把光标设置为 ,问题是逻辑问题,考虑几种情况:
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——当发现重复项时,但当我运行时,它似乎不起作用。某个无限循环?也不知道为什么。您错误地将其同时用于插入和循环控制变量。此外,这应该读取整个文件吗(与此相反,刚传入numbercount
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;
}