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和操作符