gpt4 book ai didi

c++ - 了解在具体示例中使用 getilne

转载 作者:行者123 更新时间:2023-12-03 07:22:21 27 4
gpt4 key购买 nike

我知道我要问的问题可能是重复的,但是鉴于类似问题的答案,我无法解决问题。我刚开始使用 C++,对它不是很熟悉。
我在读取 4 列和近 28000 行的 CSV 文件时遇到以下问题。问题在于我无法理解 std::getline()函数,我以为我知道它的行为,直到我打印结果。
变量的名称确实与项目有关,所以如果代码可读性不强,我会道歉,我决定调用s_index作为“起始索引”和 e_index作为“结束索引”,类似 v_boolean是一个 bool vector ,我的结构的通用节点称为 NodeGraphNode表示面向公共(public)交通的节点(整数)Graph , 初始化为 vector .
代码如下所示:

// Reading network_walk.csv
cout << "Reading network_walk.csv" << endl;

ifstream thirdfile;
string thirdfile_line;

thirdfile.open("network_walk.csv");
getline(thirdfile,thirdfile_line); // Skip the first row

while(!thirdfile.eof()) {

getline(thirdfile, thirdfile_line, ';');

int s_index = atoi(thirdfile_line.c_str());

getline(thirdfile, thirdfile_line, ';');
int e_index = atoi(thirdfile_line.c_str());

cout << s_index << " " << e_index << "" <<endl;

if (v_boolean[s_index]*v_boolean[e_index] == true ) {

NodeGraph Node;

Node.to_stop_I = e_index;

getline(thirdfile, thirdfile_line, ';');
Node.arr_time = (atoi(thirdfile_line.c_str()))*36.0 /50.0;

getline(thirdfile, thirdfile_line, ';'); //Ignore the third data.

Node.route_type = -1;

Graph[s_index].push_back(Node);

}

getline(thirdfile, thirdfile_line);
}

thirdfile.close();
我应该得到什么和我实际得到什么如下所示:
image
image

最佳答案

您尚未显示原始 CSV 文件数据,但您的代码依赖于由 ; 终止的第 4 列在 EOL 之前。您的屏幕截图没有显示是否确实如此,但如果第 4 列未由 ; 终止然后 I can reproduce the issue当您的 v_boolean[]元素评估为真。读取第 4 列值将通过 EOL 读取到下一行的第 1 列,然后是最终的 getline()。将跳过下一行的其余部分,因此您跳过读取该行的第 2-4 列。另一方面,当 v_boolean元素评估为假,您跳过第 3 列和第 4 列的读取,以及最后的 getline()读取到当前行的 EOL,如预期的那样。
当您指定 '\n' 以外的终止符时, std::getline()正如预期的那样,不会停止阅读 EOL。
解决方法是使用 std::getline()一次读取整行,然后使用 std::istringstream根据需要解析每一行的值。那么第 4 列是否以 ; 终止都没关系。或不。
试试这个:

// Reading network_walk.csv
cout << "Reading network_walk.csv" << endl;

ifstream thirdfile;
string thirdfile_line;

thirdfile.open("network_walk.csv");
getline(thirdfile, thirdfile_line); // Skip the first row

while (getline(thirdfile, thirdfile_line)) {

istringstream iss(thirdfile_line);
string thirdfile_value;

getline(iss, thirdfile_value, ';');
int s_index = atoi(thirdfile_value.c_str());

getline(iss, thirdfile_value, ';');
int e_index = atoi(thirdfile_value.c_str());

cout << s_index << " " << e_index << "" <<endl;

if (v_boolean[s_index]*v_boolean[e_index]) {

NodeGraph Node;

Node.to_stop_I = e_index;

getline(iss, thirdfile_value, ';');
Node.arr_time = (atoi(thirdfile_value.c_str()))*36.0 /50.0;

Node.route_type = -1;

Graph[s_index].push_back(Node);
}
}

thirdfile.close();
或者,考虑使用 operator>>而不是 getline()读取单个整数,例如:
// Reading network_walk.csv
cout << "Reading network_walk.csv" << endl;

ifstream thirdfile;
string thirdfile_line;

thirdfile.open("network_walk.csv");
getline(thirdfile, thirdfile_line); // Skip the first row

while (getline(thirdfile, thirdfile_line)) {

istringstream iss(thirdfile_line);
int s_index, e_index;

iss >> s_index;
iss.ignore(numeric_limits<streamsize>::max(), ';');

iss >> e_index;
iss.ignore(numeric_limits<streamsize>::max(), ';');

cout << s_index << " " << e_index << "" <<endl;

if (v_boolean[s_index]*v_boolean[e_index]) {

NodeGraph Node;

Node.to_stop_I = e_index;

int temp;
iss >> temp;
Node.arr_time = temp * 36.0 / 50.0;

Node.route_type = -1;

Graph[s_index].push_back(Node);
}
}

thirdfile.close();

关于c++ - 了解在具体示例中使用 getilne,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64760250/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com