Я только что переставил ваш код, как он должен выглядеть, и он работает правильно.
В кодировании наличие грязного кода означает наличие ошибок, которые вы не можете отследить. Разделите ваш код на мельчайшие логические компоненты и напишите код, чтобы он был читабельным ( без комментариев в коде! ). Я ничего не сделал, кроме реорганизации кода синтаксического анализа.
Кроме того, обратите внимание, что у вас есть точка (.
) в конце каждой строки, вы должны либо удалить ее из ввода, либо обработать ее в коде.
// these are the streams used:
#include <istream>
#include <sstream>
std::vector<std::string> parse_stream(std::istream& stream)
{
std::vector<std::string> res{};
std::string line;
while(std::getline(stream, line))
{
res.push_back(line);
}
return res;
}
std::vector<std::string> split_line(std::istream& stream, char delimiter)
{
std::vector<std::string> res{};
std::string token;
while(std::getline(stream, token, delimiter))
{
res.push_back(token);
}
return res;
}
void print_vector(const std::vector<std::string>& vec)
{
for (const std::string& str: vec)
{
std::cout << str << ", ";
}
std::cout << std::endl;
}
int main()
{
std::string in_str = "A:Head:1:2:15\nB:Torso:0:6:5\nC:Leg:0:4:6\nD:Arm:0:4:8\nE:Tail:0:6:2";
std::istringstream ss{in_str};
auto parsed_stream = parse_stream(ss);
print_vector(parsed_stream);
for (const auto& line : parsed_stream)
{
std::istringstream line_ss{line};
auto splited_line = split_line(line_ss, ':');
print_vector(splited_line);
}
}
Вывод:
A:Head:1:2:15, B:Torso:0:6:5, C:Leg:0:4:6, D:Arm:0:4:8, E:Tail:0:6:2,
A, Head, 1, 2, 15,
B, Torso, 0, 6, 5,
C, Leg, 0, 4, 6,
D, Arm, 0, 4, 8,
E, Tail, 0, 6, 2,