C++ 在C+中将字符串转换为int+;

C++ 在C+中将字符串转换为int+;,c++,string,C++,String,我试图将从文件中读入的字符串转换为int值,以便将其存储在整数变量中。这就是我的代码的样子: ifstream sin; sin.open("movie_output.txt"); string line; getline(sin,line); myMovie.setYear(atoi(line)); 在这里,setYear是电影类中的一个变种(myMovie是电影类的一个对象),如下所示: void Movie::setYear(unsigned int year) {

我试图将从文件中读入的字符串转换为int值,以便将其存储在整数变量中。这就是我的代码的样子:

ifstream sin;  
sin.open("movie_output.txt");  
string line;  
getline(sin,line);  
myMovie.setYear(atoi(line));
在这里,setYear是电影类中的一个变种(myMovie是电影类的一个对象),如下所示:

void Movie::setYear(unsigned int year)  
{  
    year_ = year;  
}
运行代码时,出现以下错误:

error C2664: 'atoi' : cannot convert parameter 1 from 'std::string' to 'const char *'  
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
myMovie.setYear(atoi(line.c_str())

您可以执行atoi(line.c_str())

另一种使用C++流的方法是:

stringstream ss(line);
unsigned int year;
ss >> year;

与其使用std::getline(std::string&,std::istream&),为什么不在文件上使用流提取操作符呢

ifstream sin;
sin.open("movie_output.txt");
unsigned int year = 0;
sin >> year;
myMovie.setYear(year);

快速修复方法是使用line.c_str(),它为atoi()提供常量char*

更好的解决方案(如果可用)可能是使用boost::lexical_cast(line)。这是C++ism的一个更简洁的版本,它将内容推入和移出std::stringstream,其中包含您可能需要的所有类型转换
#include <boost/lexical_cast.hpp>
使用词汇转换:

int value = boost::lexical_cast<int>(line);
int-value=boost::词法转换(行);

啊,这很有效。非常感谢。另外,如果你不介意的话,你能解释一下为什么需要.c_str()吗?@xbonez:因为atoi不能处理字符串。它在const char*s上工作。atoi是C标准的遗留物。为了使字符串变成一个conchar,你调用cStrr成员。C++有2种存储字符串的方式。第一种方式是从C,这是char *,基本上是字符数组(或指向数组的指针),第二种方法是新的STD::string。但是,它们是不等价的,许多需要char*s的函数(比如从C继承的atoi函数)无法处理std::string输入。因此,在某些情况下,您可能需要从std::string获取C样式的字符串(C_str()),以使其工作。有没有一种不用它的方法呢?它就像一个重复出现的新闻组帖子。我们应该将这些与重复出现的回答帖子同步,每个人都会很高兴。。。。然后为那些建议使用
atoi()
的人添加相同的常见评论回复,然后严重地所有的评论都会膨胀。@wilhelmtell:如果你能找到重复的,请随意标记…@Billy 1243428 2023519 1766150 893670 1883056 2393873 200090 1878001 1141741 1817992 504635 64782 207054 225362 194465 1496536 2066184,请注意,这不是一个详尽的列表。对于错误处理,当文件中没有数字时,
sin.fail()
在提取年份后是正确的。stream绝对是更好的选择