无法从 .hpp 文件中的 class 获取 return 数据

unable to get return data from class in .hpp file

我有 2 个文件:main.cpp 和 parser.hpp

我正在 returning vector 来自 parser.hpp 中 class 的成员函数。然而,我的 main.cpp 似乎没有从 return 值中得到任何东西,因为当我打印它的大小时,我得到 0。 这是我的 main.cpp:

#include <vector>
#include <cstring>
#include <fstream>
#include <iostream>
#include "parser.hpp"

using namespace std;

int main()
{
    ifstream file;
    file.open("test.csv");
    csv obj;
    obj.parse(file);
    obj.print_parsed_csv(file);

    vector<vector<string>> parsed_csv_data = obj.parse(file);
    cout << parsed_csv_data.();
    cout << parsed_csv_data.size();
    for (int i = 0; i < parsed_csv_data.size(); i++)
    {
        for (int j = 0; j < parsed_csv_data[i].size(); j++)
            cout << parsed_csv_data[i][j] << '\t';
        cout << endl;
    }
}

这是我的parser.hpp

using namespace std;

class csv
{
public:
    vector<vector<string>> parse(ifstream &file)
    {
        string str;
        vector<vector<string>> parsed_data;
        while (getline(file, str))
        {
            vector<string> parsed_line;
            while (!str.empty())
            {
                int delimiter_pos = str.find(',');
                string word = str.substr(0, delimiter_pos);
                // cout << word << " ";

                if (delimiter_pos == -1)
                {
                    parsed_line.push_back(word);
                    break;
                }
                else
                {
                    str = str.substr(delimiter_pos + 1);
                    // cout << str << endl;
                    parsed_line.push_back(word);
                }
            }
            parsed_data.push_back(parsed_line);
        }
        return parsed_data;
    }

    void print_parsed_csv(ifstream &file)
    {
        vector<vector<string>> parsed_csv_data = parse(file);
        cout << parsed_csv_data.size();
        for (int i = 0; i < parsed_csv_data.size(); i++)
        {
            for (int j = 0; j < parsed_csv_data[i].size(); j++)
                cout << parsed_csv_data[i][j] << '\t';
            cout << endl;
        }
    }
};

我只在 parse() 中得到正确的 cout 输出。 parser.hpp 中的 print_parsed_csv() 和 main.cpp 中的 cout 都将 0 作为变量的大小。

我该如何解决这个问题?

第一次调用 obj.parse 时,会读取流对象,直到到达文件末尾。您需要重新打开文件或重置 file 以在读取文件后指向文件的开头。

您将相同的 file 变量传递给以下三个函数中的每一个,但只有第一个有效。对 obj.parse 的第一次调用移动到 file 在输入文件中指向的位置。当 obj.parse 第一次退出时,file 指向文件末尾,因此在随后的 2 次调用中使用它时,没有任何内容可读。

    obj.parse(file);  // <-- this works fine
    obj.print_parsed_csv(file);  // <-- this fails

    vector<vector<string>> parsed_csv_data = obj.parse(file);fails
                                          // ^^^^^^^^^- this fails

有关如何将 ifstream 重置为文件开头的答案,请参阅 this question