使用递归函数读取txt文件的行

时间:2016-10-25 19:47:19

标签: c++ recursion ifstream

我对c ++很陌生,我想弄清楚如何使用递归函数来读取.txt文件并将它们保存在字符串中。我希望函数在读取完成时返回true值。我试图在互联网上找到解决方案,但到目前为止还没有运气。我尝试过以下方法:

void readFile(ifstream& stream, vector<string> v)
{
    if (stream.eof()) {
        return true;
    }
    else {
        string line;
        getline(stream, line);
        v.pushback(line);
        readFile(stream, v);
    }
}

请注意,我想使用这些参数,我不想更改它们

2 个答案:

答案 0 :(得分:1)

由于你没有传递对向量的引用,所以即使你push_back()该行,一旦特定的调用结束,它也不会持久存在。

我假设您已经打开了文件:

string readFile(ifstream& stream, vector<string> v){
   if(stream.eof())
      return "";

   string line;
   getline(stream, line)
   return line + "\n" + readFile(stream, v)
}

所以你有两个选择:

  1. 通过引用传递矢量。
  2. 或者根本不传递矢量。如果您有严格的要求,可以将其保留在参数中,但是您不应该使用它。并返回该调用读取的行。到达eof()时返回“”。做这样的事情:

    yield from

答案 1 :(得分:0)

立即跳出来的问题:

  1. v按值传递。这意味着对原始v进行了大量复制,复制和更改。需要将其更改为按值传递:void readFile(ifstream& stream, vector<string> & v)

  2. if (stream.eof())将始终允许reading one line past the end of the file具有不可预测的结果。像if (!std::getline(stream, line))之类的东西会解决这个问题,但会有更好的解决方案。

  3. return true函数无法void

  4. 不必要的堆叠杀手。一个大文件会很快耗尽整个堆栈或实现用作自动数据存储区的任何内容。

  5. 可能的实施:

    void readFile(std::istream& stream, std::vector<std::string> & v)
    {
        std::string line;
        if (std::getline(stream, line))
        {
            v.push_back(line);
            readFile(stream, v);
        }
    }
    

    注意:

    1. istream代替ifstream。这允许使用stringstream进行更广泛的输入和测试。
    2. v上方的解决点1通过引用传递。
    3. 解决上述第2点,line被推入v,只有在从stream读取数据时才会进行递归调用。如果未读取任何数据,则不会更新v并且递归结束。
    4. 不依赖using namespace std;。这消除了难以发现错误的常见原因。
    5. 这仍然会杀死堆栈,但它会更慢地杀死它。这是递归,因此如果给出足够的输入,没有什么能阻止最终的堆栈溢出。