2013-05-02 2 views
1

Я прочитал строку из файла, и я пытаюсь преобразовать ее в int. По какой-то причине atoi() (конвертировать строку в целое число) не принимает std::string в качестве аргумента (возможно, некоторая проблема со строками vs c-strings vs char arrays?) - как мне получить atoi(), чтобы работать правильно, поэтому я могу разобрать этот текстовый файл ? (собирается вытаскивать из него много ints).Не могу сделать 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 работу должным образом?

EDIT: спасибо, все работает! новый код:

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

+2

@PlasmaHH, Точно, но вы имеете в виду 'strtol'. 'boost :: lexical_cast' также может быть вариантом. Там * есть вопрос обо всем этом где-то IIRC. – chris

+0

atoi, не сообщающий об ошибках, кажется полезным, он пытается работать, даже если что-то идет не так, а не бросает на меня исключение и уходит. Из www.cplusplus.com было установлено, что atoi хорош, потому что «гарантия отсутствия броска: эта функция никогда не выдает исключений». – user2333388

ответ

6

В c_str метод существует для этой цели.

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

BTW ваш код должен прочитать

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

Просто потому, что файл является 'хорошим' не означает, что следующего GetLine будет успешным, только что последнего GetLine удался. Используйте getline непосредственно в своем состоянии, чтобы узнать, действительно ли вы прочитали строку.

+0

он работает - спасибо! Кстати, любая идея, почему string filename = "data.txt"; ifstream file (filename) не удается, но файл ifstream ("data.txt"); работает? – user2333388

+1

То же решение 'ifstream file (filename.c_str());' Хотя я думаю, что в C++ 11 вы также можете использовать строку. Существует автоматическое преобразование из char * в строку, но не наоборот. Это способ, которым был разработан класс string. – john

1

Использование line.c_str() вместо того, чтобы просто line

Это atoi берет const char* а не std::string