使用 stringstream 将字符串转换为 int
Posted
技术标签:
【中文标题】使用 stringstream 将字符串转换为 int【英文标题】:using stringstream to conver string to int 【发布时间】:2017-04-29 23:54:38 【问题描述】:这是我的功能
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++;
//....
这是data.txt
1,furkan,100,没有任务,
我试图将 data.txt 上的内容写入 str。到目前为止没有问题。之后我想将 string 转换为 int,它在第一次转换时有效,但在其余部分无效
我把 1 改成 0 看看它是否有效,它有效,但其余的 i_str 无效
【问题讨论】:
【参考方案1】:1) std::istringstream
获得自己的 副本 str2。它不监视这个变量的变化。
2) 你应该怎么做:
char c;
ss>>i_str//read int value from stream
>>c;//and throw away separator
这里不需要getline。
【讨论】:
【参考方案2】:警告:这个答案对于手头的特定工作来说有点矫枉过正。它使用了几个相当通用的实用程序,使工作变得简单,但如果这是您唯一使用它们的时间/地点,可能值得写(但事实并非如此——它们在一般来说,一旦你拥有它们)。我将它们保存在“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);`
同样,尽管实现有点复杂,但使用似乎很明显(至少对我而言)。
一旦我们有了这些,你的工作就变得微不足道了。我要做的一件事可能最初看起来有点棘手,那就是在 lifeform
类的流提取运算符中实现读取:
#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;
...以及一些代码来测试它们并查看它们是否正常工作:
int main()
std::istringstream input("1,furkan,100,No mission,");
lifeform f;
input >> f;
std::cout << f;
【讨论】:
以上是关于使用 stringstream 将字符串转换为 int的主要内容,如果未能解决你的问题,请参考以下文章
使用 stringstream 将动态大小的字符串转换为整数
如何使用 stringstream 在 C++ 中将字符串转换为双精度值 [关闭]