我正在从文件中读取数据并将其放入字符串标记中,如下所示:
std::vector<Mytype> mytypes;
std::ifstream file("file.csv");
std::string line;
while (std::getline(file, line)){
std::stringstream lineSs(line);
std::vector<std::string> tokens;
std::string token;
while (std::getline(lineSs, token, ',')){
tokens.push_back(token);
}
Mytype mytype(tokens[0], tokens[1], tokens[2], tokens[3]);
mytypes.push_back(mytype);
}
显然这是一种非常标准的做法。但是,数据没有NULL值,而是在那时它只是空的。我的意思是数据看起来像这样:
id0,1,2,3
id1,,2,
id2,,,3
中间线的情况导致我出现问题,因为在“2”之后没有任何东西被推回到我的标记向量中,尽管应该有一个空字符串。然后,当我尝试创建Mytype实例时,我遇到了一些out_of_range问题。
到目前为止,我一直在检查每行的最后一个字符是否为逗号,如果是,则在行尾添加一个空格。但我想知道是否有更好的方法来做到这一点。
感谢。
答案 0 :(得分:2)
区别在于第2行在最后一次调用getline()之前有!lineSs.eof()。所以你应该停止循环,如果getline()返回false( note :这不是真的getline()
返回false,但是当流转换为bool时流为false);相反,一旦lineSs.eof()返回true,就停止它。
以下是对您的计划的修改,显示了这个想法:
int main() {
std::string line;
while (std::getline(std::cin, line)){
std::stringstream lineSs(line);
std::vector<std::string> tokens;
do {
std::string token;
std::getline(lineSs, token, ',');
tokens.push_back(token);
std::cout << "'" << token << "' " << lineSs.eof() << ' ' << lineSs.fail() << std::endl;
} while(!lineSs.eof());
std::cout << tokens.size() << std::endl;
}
}
它将显示&#34; 3&#34;在&#34; 1,2,3&#34;和&#34; 4&#34;的最后一行; for&#34; 1,2,3,&#34;。
答案 1 :(得分:1)
如果行以逗号结尾,向向量添加空字符串的简单方法就是在创建mytype
之前检查该字符串。如果你添加
if (line.back() == ',')
tokens.push_back("");
在你的内部while循环之后,如果你结束将是一个空列,这将向tokens
添加一个空字符串。
所以
while (std::getline(lineSs, token, ',')){
tokens.push_back(token);
}
变为
while (std::getline(lineSs, token, ',')){
tokens.push_back(token);
}
if (line.back() == ',')
tokens.push_back("");