将字符串从istream递归传输到数组-C ++

时间:2018-07-25 20:20:44

标签: c++ recursion ifstream

我正在尝试将.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传递给此函数时将始终为空。我正在练习递归,因此无法使用whilefor循环。关于我所缺少的任何想法吗?

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;
}

2 个答案:

答案 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循环的代码相同。