所以我从文件中读出行,然后通过stringstream读出行。
我发现问题是因为线的格式很少将2个单独的部分写在一起并作为一个字符串一起读取。我试图通过将错误的读取值放回到流上并再次读取来解决这种情况,但看起来像istringstream并不关心我把字符放回去。他们根本就不会再读出来了。
这里的问题已经解决了。 S1是一个很好的字符串。 S2在评论中错误地阅读了问题:
简而言之。是否可以将字符串放回istringstream并使用下一个操作读取它?
#include <sstream>
#include <string>
#include <vector>
int main()
{
std::string device_id; //126, I_VS_MainVoltageAvailabl
std::string ea_type; //E
std::string address; //0.1
std::string data_type; //BOOL
std::vector<std::string> comment; //VS - Steuerspannung vorhanden / Main voltage available"
std::string s1 = "126,I_Btn_function_stop E 1.2 BOOL Taster Stopp Funktion / Button Stop Function";
std::string s2 = "126,I_VS_MainVoltageAvailablE 0.1 BOOL VS - Steuerspannung vorhanden / Main voltage available";
std::istringstream ist{ s2 };
ist >> device_id; // Read 126, I_VS_MainVoltageAvailablE the E should be read in ea_type
ist >> ea_type; // 0.1
//my idea
if (!ea_type.empty() && isdigit(static_cast<unsigned char>(ea_type[0]))) { //first is a digit so already next was read
for (const auto& x : ea_type) //Try to put 0.1 in the stream
ist.putback(x);
ea_type = device_id[device_id.size() - 1]; // = "E"
device_id.pop_back(); // = "126, I_VS_MainVoltageAvailabl"
}
ist >> address; // Expected "0.1" instead "BOOL" why 0.1 was putback on the stream???
ist >> data_type;
for (std::string in; ist >> in;)
comment.push_back(in);
}
答案 0 :(得分:4)
像往常一样,人们忽略了返回代码。 putback
有一个原因的返回码,当它为false时,表示putback
失败。
特别是,std::istringstream
是输入字符串流,因此是仅输入流。因此,您无法在其上使用putback
,它将始终失败。
但是,您可以使用std::stringstream
代替putback
,{{1}}将按照您希望的方式运行。
答案 1 :(得分:1)
我建议您的逻辑格式不正确。你实际拥有的是固定字段格式,它不适用于istream提取操作符。
您最好阅读整行输入,然后按列偏移提取“字段”。
或者,一次读取一个字节,附加到要提取的字符串变量,直到读取足够的字节来填充它。也就是说,将29个字节读入device_id,然后将多个(1?8?)字节读入ea_type等。
但我想质疑你的评论。 istream字符串提取器operator>>(std::istream&, std::string&)
将从输入流中提取一个空格分隔的标记。换句话说,你的第一次提取就会导致"126,"
。所以逻辑的其余部分是完全错误的。