2013-05-02 91 views
1

我已经从文件中读取一行,我试图将它转换为int。由于某种原因,atoi()(将字符串转换为整数)将不接受std::string作为参数(可能与字符串vs c字符串vs char数组有关的一些问题?) - 我如何才能使atoi()正常工作,以便我可以解析此文本文件? (将会从中抽取很多整数)。不能让atoi采取一个字符串(字符串与C字符串?)

代码:

int main() 
{ 
    string line; 
    // string filename = "data.txt"; 
    // ifstream file(filename) 
    ifstream file("data.txt"); 
    while (file.good()) 
    { 
     getline(file, line); 
     int columns = atoi(line); 
    } 
    file.close(); 
    cout << "Done" << endl; 
} 

线造成的问题是:

int columns = atoi(line); 

这给错误:

error: cannot convert 'std::string' to 'const char*' for argument '1' to 'int atop(const char*) '

我怎么做的atoi正常工作?

编辑:谢谢大家,它的作品!新代码:

int main() 
{ 
string line; 
//string filename = "data.txt"; 
//ifstream file (filename) 
ifstream file ("data.txt"); 
while (getline (file,line)) 
{ 
    cout << line << endl; 
    int columns = atoi(line.c_str()); 
    cout << "columns: " << columns << endl; 
    columns++; 
    columns++; 
    cout << "columns after adding: " << columns << endl; 
} 
file.close(); 
cout << "Done" << endl; 
} 

也想知道为什么 字符串文件名= “data.txt中”; ifstream的文件(文件名) 失败,但

ifstream file("data.txt"); 

的作品? (我最终会被读取文件名以命令行形式,以便需要使它不是一个字符串字面)

+3

永远不要使用atoi。它不能报告错误。使用std :: strtoi,或者更好,std :: stoi。 – PlasmaHH 2013-05-02 19:39:08

+2

@PlasmaHH,的确如此,但你的意思是'strtol'。 'boost :: lexical_cast'也可能是一个选项。 *在这个地方有一个关于IIRC的问题。 – chris 2013-05-02 19:41:05

+0

atoi不报告错误似乎是有益的,即使出现问题,它也会尝试工作,而不是向我抛出异常并退出。从www.cplusplus.com,发现atoi是好的,因为“无丢包保证:这个函数永远不会抛出异常。” – user2333388 2013-05-02 19:53:01

回答

6

的c_str方法存在这个目的。

int columns = atoi(line.c_str()); 

BTW你的代码应该阅读

while (getline (file,line)) 
{ 
    ... 

只是因为该文件是 '好' 并不意味着下一个函数getline会成功,只有那最后函数getline成功。直接在你的while条件中使用getline来判断你是否真的读了一行。

+0

它的作品 - 谢谢!顺便说一句,任何想法为什么字符串文件名=“data.txt”; ifstream文件(文件名)失败但是ifstream文件(“data.txt”);作品? – user2333388 2013-05-02 19:47:33

+1

相同的解决方案'ifstream file(filename.c_str());'虽然我认为在C++ 11中也可以使用字符串。有一个从char *到字符串的自动转换,但不是相反。这是字符串类的设计方式。 – john 2013-05-02 19:49:03

1

使用line.c_str(),而不是仅仅line

这的atoi需要const char*不是std::string

2

int columns = atoi(line.c_str());