Не могу заставить Atoi взять строку (строка против C-строки?)

Я прочитал строку из файла и пытаюсь преобразовать ее в int. По какой-то причине atoi() (преобразовать строку в целое число) не примет std::string в качестве аргумента (возможно, некоторые проблемы со строками против c-строк против массивов символов?) — как я могу получить atoi() работать правильно, чтобы я мог разобрать этот текстовый файл? (собирается извлечь из него много целых).

Код:

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);

который дает ошибку:

ошибка: невозможно конвертировать 'std::string' в 'const char*' для аргумента от ‘1’ до ‘int atop(const char*)

Как мне заставить Атои работать правильно?

РЕДАКТИРОВАТЬ: спасибо всем, это работает! новый код:

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;
}

Также интересно, почему
строка filename = «data.txt»;
файл ifstream (имя файла)
не удается, но

    ifstream file("data.txt");

работает?
(Я в конечном итоге буду читать имя файла из командной строки, поэтому нужно сделать так, чтобы оно не было строковым литералом)

2

Решение

Для этого существует метод c_str.

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

Кстати ваш код должен читать

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

То, что файл «хороший», не означает следующий getline преуспеет, только то, что прошлой Getline успешно. Используйте getline прямо в вашем состоянии while, чтобы узнать, действительно ли вы прочитали строку.

7

Другие решения

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

2

использование line.c_str() вместо просто line

Этот атой занимает const char* не std::string

1