使用字符串流标记字符串,其中最后一个字符是分隔符
Tokenize a string with stringstream where the last char is the delimiter
我正在从文件中读取数据,并将其放入字符串标记中,如下所示:
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的实例时,我遇到了一些超出范围的问题。
到目前为止,我一直在检查每行的最后一个字符是否是逗号,如果是,请在行的末尾添加一个空格。但我想知道是否有更好的方法可以做到这一点。
谢谢。
不同之处在于第2行有!最后一次调用getline()之前的lineSs.of()。因此,如果getline()返回false,则不应停止循环(注意:这并不是真正的getline()
返回false,而是流在被转换为bool时为false);相反,一旦lineSs.of()返回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;
}
}
它将在最后一行显示"3"表示"1,2,3","4"表示"1,3,3"。
如果行以逗号结尾,则向向量添加空字符串的一种简单方法是在创建mytype
之前检查该字符串。如果添加
if (line.back() == ',')
tokens.push_back("");
在您的内部while循环之后,如果您结束的是null列,那么这将向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("");
相关文章:
- 获取用C/C++打印的最后一个字符串
- std::字符串擦除以删除最后一个字母
- 如何检查字符串中的最后一个字符是否是某个字符并将其从字符串中删除?(C++)
- 为什么 for 循环只接受这个简单代码中的最后一个字符串?
- "如何使用C++将字符串的第一个和最后一个索引返回到向量中?
- std::getline 读取最后一个字符串两次
- 忽略set_difference向量向量中的最后一个字符串
- 在C 字符串中,为什么在最后一个字符之后,通过索引和()访问索引时行为是不同的
- 如何确定文本中的最后一个字符串值
- 如何查看复杂度为 O(1) 的字符串流对象中的最后一个字符
- COUT:最后一个字符串覆盖第一个字符串
- 将指针分配给字符串对象的第一个也是最后一个索引
- 如何在C 中获得字符串的最后一个字符
- 在字符串中找到最后一个单词
- 从字符串中删除字符的第一个和最后一个实例
- 删除文件 C++ 中字符串中最后一个出现的字符
- 如何在C++中删除 UTF-8 字符串的最后一个字符
- 如何将文本(诗歌)拆分为行(字符串/字符[])并查找每个行的最后一个单词
- 如何获取用"::"分隔的标记化字符串中的最后一个元素C++?
- 输出字符串使用 C++ 覆盖 Linux 终端上的最后一个字符串