2010-04-14 9 views
2

J'essaie de convertir une chaîne que j'ai lue d'un fichier en une valeur int afin de pouvoir la stocker dans une variable entière. C'est ce que mon code ressemble à:convertir la chaîne en int en C++

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

Ici, setYear est un mutator dans la classe Movie (myMovie est un objet de classe Movie) qui ressemble à ceci:

void Movie::setYear(unsigned int year) 
{ 
    year_ = year; 
} 

Quand je lance le code, je reçois l'erreur suivante:

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

Il est comme un de ces messages du forum récurrents. Nous devrions simplement les synchroniser avec des réponses récurrentes et tout le monde sera content. – wilhelmtell

+0

... puis ajoutez la même réponse de commentaire habituelle pour ceux qui suggèrent d'utiliser 'atoi()', et serons alors sérieusement tous enflés. – wilhelmtell

+0

@wilhelmtell: Si vous pouvez trouver un duplicata, n'hésitez pas à marquer comme tel ... –

Répondre

5

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

+0

ah, cela fonctionne. Merci beaucoup. aussi, si cela ne vous dérange pas, pourriez-vous expliquer pourquoi le .c_str() est requis? – xbonez

+0

@xbonez: Parce que atoi ne fonctionne pas avec les chaînes. Cela fonctionne sur const char * s. atoi est une relique de la norme C. Pour transformer une chaîne en const char *, vous appelez le membre c_str. –

+0

C++ a deux façons de stocker des chaînes - la première est reportée de C, qui est char *, essentiellement un tableau (ou un pointeur vers un tableau) de caractères, et la deuxième est la nouvelle chaîne std :: string. Cependant, ils ne sont pas équivalents et de nombreuses fonctions qui attendent char * s (comme la fonction atoi qui a été transférée de C) ne peuvent pas traiter les entrées std :: string. Ainsi, dans certains cas, vous devrez peut-être obtenir la chaîne de style C (c_str()) de la chaîne std :: afin de le faire fonctionner. – jonathanasdf

3

Vous pouvez faire atoi(line.c_str())

Une autre approche, en utilisant les flux de C, est:

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

flux est certainement meilleure option –

10

Plutôt que d'utiliser std::getline(std::string&, std::istream&), pourquoi ne pas simplement utiliser l'opérateur d'extraction de flux sur le fichier?

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

+1. QFT. c'est une bien meilleure façon. – jonathanasdf

+0

Pour la gestion des erreurs, lorsqu'il n'y avait pas de nombre dans le fichier, 'sin.fail()' est vrai après l'extraction de l'année. – Rudi

1

Le correctif rapide est d'utiliser line.c_str() qui fournit un const const * pour atoi().

Une meilleure solution (si disponible) peut être d'utiliser boost :: lexical_cast (ligne). Ceci est une version plus simple de l'isme C++ de pousser les choses dans et hors d'un std :: stringstream qui a toutes les conversions de type dont vous avez besoin.

5
#include <boost/lexical_cast.hpp> 

Utilisez le lexical_cast:

int value = boost::lexical_cast<int>(line);