C++ istringstream将字符串放回输入并重新读取

C++ istringstream将字符串放回输入并重新读取,c++,c++11,c++14,stringstream,C++,C++11,C++14,Stringstream,所以我从文件中读出行,然后通过stringstream读出行 我发现,由于行的格式,很少有两个独立的部分写在一起,并作为一个字符串一起读取。我试图通过将错误的读取值放回流并再次读取来修复这种情况,但看起来istringstream并不在乎我是否将字符放回。他们再也不会被读出了 在这里问题被解决了。S1是一个很好的字符串。S2以注释中的错误读数处理问题: 简而言之。是否可以将字符串放回istringstream并在下一个操作中读取它 #include <sstream> #includ

所以我从文件中读出行,然后通过stringstream读出行

我发现,由于行的格式,很少有两个独立的部分写在一起,并作为一个字符串一起读取。我试图通过将错误的读取值放回流并再次读取来修复这种情况,但看起来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);
}
#包括
#包括
#包括
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