无法从 .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。
我有 2 个文件:main.cpp 和 parser.hpp
我正在 returning vector
#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。