2010-04-14 2 views
2

Я пытаюсь преобразовать строку, которую я прочитал из файла, в значение int, чтобы я мог хранить его в целочисленной переменной. Это то, что мой код выглядит следующим образом:преобразование строки в int в C++

ifstream sin; 
sin.open("movie_output.txt"); 
string line; 
getline(sin,line); 
myMovie.setYear(atoi(line)); 

Здесь, setYear является мутатор в классе Movie (myMovie является объектом класса Movie), который выглядит следующим образом:

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 
+0

Это как один из тех повторяющихся сообщений групп новостей. Мы должны просто синхронизировать их с повторяющимися сообщениями о ответах, и все будут счастливы. – wilhelmtell

+0

... а затем добавьте тот же обычный ответ комментария для тех, кто предлагает использовать 'atoi()', а затем серьезно все будет раздуваться. – wilhelmtell

+0

@wilhelmtell: Если вы можете найти дубликат, не стесняйтесь отмечать как таковые ... –

ответ

5

myMovie.setYear(atoi(line.c_str()));

+0

ах, что работает. благодаря тонну. также, если вы не возражаете, не могли бы вы объяснить, почему требуется .c_str()? – xbonez

+0

@xbonez: Потому что atoi не работает на строках. Он работает на const char * s. atoi является реликвией стандарта C. Чтобы создать строку в const char *, вы вызываете член c_str. –

+0

C++ имеет 2 способа хранения строк - первый путь переносится из C, который является char *, в основном массивом (или указателем на массив) символов, а вторым способом является новая std :: string. Однако они не эквивалентны, и многие функции, ожидающие char * s (как функция atoi, перенесенная с C), не могут обрабатывать входные данные std :: string. Таким образом, в некоторых случаях вам может понадобиться получить строку стиля C (c_str()) из строки std ::, чтобы заставить ее работать. – jonathanasdf

3

Вы можете сделать atoi(line.c_str())

Другой подход, с использованием C++ потоков, является:

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

поток определенно лучший вариант –

10

Вместо того чтобы использовать std::getline(std::string&, std::istream&), почему бы не просто использовать оператор извлечения потока на файл?

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

+1. QFT. это намного лучший способ. – jonathanasdf

+0

Для обработки ошибок, когда в файле не было числа, 'sin.fail()' истинно после извлечения года. – Rudi

1

Быстрое решение заключается в использовании line.c_str(), который предоставляет const char * для atoi().

Лучшим решением (если доступно) может быть использование boost :: lexical_cast (строка). Это более аккуратная версия C++ ism для ввода и вывода из std :: stringstream, которая имеет все преобразования типов, которые вам, скорее всего, понадобятся.

5
#include <boost/lexical_cast.hpp> 

Используйте lexical_cast:

int value = boost::lexical_cast<int>(line); 
Смежные вопросы