C++ istringstream将字符串放回输入并重新读取
所以我从文件中读出行,然后通过stringstream读出行 我发现,由于行的格式,很少有两个独立的部分写在一起,并作为一个字符串一起读取。我试图通过将错误的读取值放回流并再次读取来修复这种情况,但看起来istringstream并不在乎我是否将字符放回。他们再也不会被读出了 在这里问题被解决了。S1是一个很好的字符串。S2以注释中的错误读数处理问题: 简而言之。是否可以将字符串放回istringstream并在下一个操作中读取它C++ istringstream将字符串放回输入并重新读取,c++,c++11,c++14,stringstream,C++,C++11,C++14,Stringstream,所以我从文件中读出行,然后通过stringstream读出行 我发现,由于行的格式,很少有两个独立的部分写在一起,并作为一个字符串一起读取。我试图通过将错误的读取值放回流并再次读取来修复这种情况,但看起来istringstream并不在乎我是否将字符放回。他们再也不会被读出了 在这里问题被解决了。S1是一个很好的字符串。S2以注释中的错误读数处理问题: 简而言之。是否可以将字符串放回istringstream并在下一个操作中读取它 #include <sstream> #includ
#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);
}
#包括
#包括
#包括
int main()
{
std::string设备\u id;//126,I\u VS\u主电压可用
std::string ea_type;//E
std::字符串地址;//0.1
std::string data_type;//BOOL
std::vector comment;//VS-Steuerspannung-vorhanden/主电压可用”
std::string s1=“126,I_Btn_函数_stope1.2 BOOL Taster stop函数/按钮停止函数”;
std::string s2=“126,I_VS_Main voltage available 0.1 BOOL VS-steuerspanung vorhanden/Main voltage available”;
std::istringstream ist{s2};
ist>>设备id;//读取126,I\u VS\u main voltage可用应以ea类型读取E
ist>>ea_类型;//0.1
//我的想法
如果(!ea_type.empty()&&isdigit(static_cast(ea_type[0])){//first是一个数字,那么已经读取了next
for(const auto&x:ea_type)//尝试将0.1放入流中
一次倒回(x);
ea U type=设备\u id[device_id.size()-1];//=“E”
设备_id.pop_back();/=“126,I_VS_main voltage可用”
}
ist>>地址;//应为“0.1”而不是“BOOL”,为什么0.1放回流中???
ist>>数据类型;
for(std::string in;ist>>in;)
注释。推回(in);
}
通常,人们会忽略返回代码。putback
有一个返回代码是有原因的,如果返回代码为false,则表示putback
失败
特别是,std::istringstream
是输入字符串流,因此是仅输入的流。因此,您不能在其上使用putback
,它将始终失败
但是,您可以改用
std::stringstream
,这样putback
将按照您希望的方式运行。像往常一样,人们会忽略返回代码。putback
有一个返回代码是有原因的,如果它为false,则意味着putback
失败
特别是,std::istringstream
是输入字符串流,因此是仅输入的流。因此,您不能在其上使用putback
,它将始终失败
但是,您可以改用
std::stringstream
,这样放回将按照您希望的方式运行。我建议您的逻辑格式不正确。您实际使用的是一种固定字段格式,不适用于istream提取运算符
您最好读取整行输入,然后根据其列偏移量提取“字段”
或者,一次读取一个字节,附加到要提取的字符串变量,直到读取足够的字节来填充它。也就是说,将29个字节读入设备id,然后将任意多(1?8?)个字节读入ea类型,等等
不过,我想质疑您的评论。istream字符串提取器运算符>>(std::istream&,std::string&)
将从输入流中提取一个空格分隔的标记。换句话说,您的第一次提取将提取“126,“
。所以剩下的逻辑是完全错误的。我认为您的逻辑是错误的。您实际拥有的是一种固定字段格式,它不适用于istream提取操作符
您最好读取整行输入,然后根据其列偏移量提取“字段”
或者,一次读取一个字节,附加到要提取的字符串变量,直到读取足够的字节来填充它。也就是说,将29个字节读入设备id,然后将任意多个(1?8?)字节读入ea类型,等等
不过,我想质疑你的评论。istream字符串提取器操作符>>(std::istream&,std::string&)
将从输入流中提取一个空格分隔的令牌。换句话说,您的第一次提取完成了“126”
。所以剩下的逻辑是完全错误的。std::basic\u istream
衍生工具不是实现这一点的正确工具。根据需要,使用普通的std::string
或向量获取并放回。但是,您可能能够操作底层的std::stream_buf
,但这是一个复杂且相当有限的过程walkaround@WhiZTiM你为什么这么说?使用stringstream
的putback非常酷,而不是istringstream
,它只是输入。@SergeyA,是的,我的评论是基于OP使用std::istringstream
的上下文std::stringstream
既可以作为输入流,也可以作为输出流,这样就可以了<代码>标准::基本流
衍生工具不是实现这一点的合适工具。根据需要,使用普通的std::string
或向量获取并放回。但是,您可能能够操作底层的std::stream_buf
,但这是一个复杂且相当有限的过程walkaround@WhiZTiM你为什么这么说?使用stringstream
的putback非常酷,而不是istringstream
,它只是输入。@SergeyA,是的,我的评论是基于OP使用std::istringstream
的上下文std::stringstream
既可以作为输入流,也可以作为输出流,这样就可以了;就这样我换成了str