C++ 使用stringstream将字符串转换为int

C++ 使用stringstream将字符串转换为int,c++,string,int,C++,String,Int,这是我的职责 void global::readData(lifeform &p) { std::ifstream ifs("data.txt"); int i=0,i_str=0; std::string str,str2; std::getline(ifs,str); std::stringstream ss(str); if(i<31) { std::getline(ss,str2,','); std::istringstream toint(str2);

这是我的职责

void global::readData(lifeform &p)
{
std::ifstream ifs("data.txt");
int i=0,i_str=0;
std::string str,str2;
std::getline(ifs,str);
std::stringstream ss(str);

if(i<31) {
    std::getline(ss,str2,',');
    std::istringstream toint(str2);
    toint >> i_str; 
    if(i_str ==1) {   //here i_str can get 1
        p.newgame=1;
        while(i<31) {
            std::getline(ss,str2,',');

            toint >> i_str; 
            if(i==0) {

                p.setName(str2);       //this also works

            }
            if(i==1) {

                p.setMaxHp(i_str);        //doesnt work

            }

            if(i==2) {

                p.setQName("main",str2);        //works

            }
             i++;
             //....
     }
   }
void global::readData(生命形式&p)
{
std::ifstream ifs(“data.txt”);
int i=0,i_str=0;
std::字符串str,str2;
std::getline(ifs、str);
std::stringstream ss(str);
如果(i>i_)str;
如果(i_str==1){//这里i_str可以得到1
p、 newgame=1;
而(i>i_)str;
如果(i==0){
p、 setName(str2);//这同样有效
}
如果(i==1){
p、 setMaxHp(i_str);//不起作用
}
如果(i==2){
p、 setQName(“main”,str2);//有效
}
i++;
//....
}
}
这是data.txt

1,furkan,100,没有任务

我试着把data.txt上写的东西转换成str。到目前为止没有问题。之后,我想把string转换成int。它在第一次转换中起作用了,但在其他转换中没有

我将1更改为0以查看它是否有效,但其余的i_str不起作用

1)
std::istringstream
获取他自己的str2副本。它不监视此变量的变化

2) 以及你应该如何做到这一点:

char c;
ss>>i_str//read int value from stream
>>c;//and throw away separator

这里不需要getline。

警告:对于手头的特定工作来说,这个答案有点过分了。它使用了一些相当通用的实用程序,使工作变得简单,但如果这是您唯一使用它们的时间/地点,那么可能值得一写(但事实并非如此——一旦您使用了它们,它们通常会非常有用)。我把它们保存在一个“input_utils.h”中,在那里我可以很容易地从任何东西中使用它们

第一个是常量字符串的输入运算符。这听起来可能毫无意义(如果它是常数,你显然无法读懂它)。它所做的是从流中读取一些固定的输入,并验证流中的内容是否符合您的预期。代码如下所示:

std::istream &operator>>(std::istream &is, char const *label) {
    if (is.flags() & std::ios::skipws)
        while (std::isspace((unsigned char)is.peek()))
            is.ignore(1);

    while (is.peek() == *label) {
        is.ignore(1);
        ++label;
    }
    if (*label) 
        is.setstate(std::ios::failbit);

    return is;
}
input_stream >> number1 >> "," >> number2 >> "," >> number3;
class line_proxy {
    std::string &s;
    char delim;
public:
    line_proxy(std::string &s, char delim) : s(s), delim(delim) {}

    friend std::istream &operator>>(std::istream &is, line_proxy const &p) {
        std::getline(is, p.s, p.delim);
        return is;
    }
};

line_proxy line(std::string &in, char delim = '\n') {
    return line_proxy(in, delim);
}
std::string s;

input_stream >> line(s); // equivalent to `std::getline(input_stream, s);`
这使我们可以很容易地读取输入中的逗号(大部分)——验证它们是否存在,否则忽略它们。因此,要读取三个由逗号分隔的数字,我们可以这样做:

std::istream &operator>>(std::istream &is, char const *label) {
    if (is.flags() & std::ios::skipws)
        while (std::isspace((unsigned char)is.peek()))
            is.ignore(1);

    while (is.peek() == *label) {
        is.ignore(1);
        ++label;
    }
    if (*label) 
        is.setstate(std::ios::failbit);

    return is;
}
input_stream >> number1 >> "," >> number2 >> "," >> number3;
class line_proxy {
    std::string &s;
    char delim;
public:
    line_proxy(std::string &s, char delim) : s(s), delim(delim) {}

    friend std::istream &operator>>(std::istream &is, line_proxy const &p) {
        std::getline(is, p.s, p.delim);
        return is;
    }
};

line_proxy line(std::string &in, char delim = '\n') {
    return line_proxy(in, delim);
}
std::string s;

input_stream >> line(s); // equivalent to `std::getline(input_stream, s);`
至少对我来说,这个词的意思似乎相当简单、直截了当和明显(而且对手头工作的适用性也几乎同样明显)

第二种方法有一个明确而明显的意图,但是实现比我希望的要简单一点(但是我不知道如何使它更简单,并且仍然可以完成这项工作)。其代码如下所示:

std::istream &operator>>(std::istream &is, char const *label) {
    if (is.flags() & std::ios::skipws)
        while (std::isspace((unsigned char)is.peek()))
            is.ignore(1);

    while (is.peek() == *label) {
        is.ignore(1);
        ++label;
    }
    if (*label) 
        is.setstate(std::ios::failbit);

    return is;
}
input_stream >> number1 >> "," >> number2 >> "," >> number3;
class line_proxy {
    std::string &s;
    char delim;
public:
    line_proxy(std::string &s, char delim) : s(s), delim(delim) {}

    friend std::istream &operator>>(std::istream &is, line_proxy const &p) {
        std::getline(is, p.s, p.delim);
        return is;
    }
};

line_proxy line(std::string &in, char delim = '\n') {
    return line_proxy(in, delim);
}
std::string s;

input_stream >> line(s); // equivalent to `std::getline(input_stream, s);`
我们这样使用它:

std::istream &operator>>(std::istream &is, char const *label) {
    if (is.flags() & std::ios::skipws)
        while (std::isspace((unsigned char)is.peek()))
            is.ignore(1);

    while (is.peek() == *label) {
        is.ignore(1);
        ++label;
    }
    if (*label) 
        is.setstate(std::ios::failbit);

    return is;
}
input_stream >> number1 >> "," >> number2 >> "," >> number3;
class line_proxy {
    std::string &s;
    char delim;
public:
    line_proxy(std::string &s, char delim) : s(s), delim(delim) {}

    friend std::istream &operator>>(std::istream &is, line_proxy const &p) {
        std::getline(is, p.s, p.delim);
        return is;
    }
};

line_proxy line(std::string &in, char delim = '\n') {
    return line_proxy(in, delim);
}
std::string s;

input_stream >> line(s); // equivalent to `std::getline(input_stream, s);`
同样,尽管实现有点复杂,但其用途似乎相当明显(至少对我而言)

一旦我们有了这些,你的工作就变得微不足道了。我要做的一件事,一开始看起来有点棘手,那就是在
生命形式
类的流提取操作符中实现读取:

#include "input_utils.h"

struct lifeform {
    int index;
    std::string name;
    int level;
    std::string mission;

    friend std::istream &operator>>(std::istream &is, lifeform &f) { 
        return is >> f.index 
                  >> "," 
                  >> line(f.name, ',') 
                  >> f.level 
                  >> "," 
                  >> line(f.mission, ',');
    }
我们可能也想写出一个生命形式:

friend std::ostream &operator<<(std::ostream &os, lifeform const&f) {
    return os << "Index: " << f.index 
              << ", name: " << f.name 
              << ", level: " << f.level 
              << ", mission: " << f.mission;
}
friend std::ostream和操作符