我正在尝试将.txt
文件中的字符串(每个词都换行)复制到数组中。主要例程如下所示。
const int MAXDICTWORDS = 5000;
int main()
{
string dict[MAXDICTWORDS];
ifstream dictfile; // file containing the list of words
dictfile.open("words.txt");
if (!dictfile) {
cout << "File not found!" << endl;
return (1);
}
int nwords = dicReader(dictfile, dict);
// dict should now hold array of words from words.txt
// nwords will be the amount of words in the array
}
这是我当前对dicReader
的实现。 dict
传递给此函数时将始终为空。我正在练习递归,因此无法使用while
或for
循环。关于我所缺少的任何想法吗?
int dicReader(istream &dictfile, string dict[])
{
int count = 0; // know this is wrong, recursive call will always reset count to 0
string item;
if (!dictfile.eof())
{
dictfile >> item;
dict[0] = item;
dicReader(dictfile, dict + 1); // is this the correct recursive call?
count++;
}
return count;
}
答案 0 :(得分:1)
您没有正确使用fileRef.update(data);
。
您需要继续在递归调用中累积值。
此外,count
是错误的。有关详细信息,请参见Why is iostream::eof inside a loop condition considered wrong?。
功能可以简化为:
if (!dictfile.eof())
答案 1 :(得分:1)
R Sahu已为您提供了完整的答案,但是还有另一种方式来构造递归函数。此替代方法将count
变量作为函数的参数。像这样
int dictionaryReader(istream &dictfile, string dict[], int count)
{
if (dictfile >> dict[0])
{
return dictionaryReader(dictfile, dict + 1, count + 1);
}
return count;
}
最初调用该函数时,您为count
提供了零值。
int nwords = dictionaryReader(dictfile, dict, 0);
在此实现中,dictionaryReader会自行调用并直接返回结果值。这称为 tail recursion 。在替代实现中,dictionaryReader会调用自身,然后将其添加到结果中,因此它不是尾部递归。
尾部递归的优点是它被简单地转换为while循环(告诉您避免使用while循环)。一些编译器为您优化了此转换。因此,您编写了一个尾部递归函数,但最终得到的代码与编写while循环的代码相同。