2013-05-02 4 views
1

J'ai lu une ligne d'un fichier et j'essaye de le convertir en int. Pour une raison quelconque, atoi() (convertir une chaîne en entier) n'acceptera pas un std::string en argument (peut-être un problème avec les chaînes vs c-strings vs char arrays?) - comment obtenir atoi() pour que je puisse analyser ce fichier texte ? (va en tirer beaucoup d'ints).Vous ne pouvez pas faire atoi prendre une chaîne (chaîne vs. C-string?)

Code:

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

Les problèmes causant la ligne est:

int columns = atoi(line); 

qui donne l'erreur:

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

Comment puis-je faire le travail atoi correctement?

EDIT: merci à tous, ça marche! nouveau code:

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

demande aussi pourquoi le nom de fichier de chaîne = "data.txt"; fichier ifstream (nom de fichier) échoue, mais

ifstream file("data.txt"); 

œuvres? (je vais éventuellement être en train de lire le nom de fichier former la ligne de commande si besoin de faire ce pas une chaîne littérale)

+3

N'utilisez jamais d'atoi. Il ne peut pas signaler les erreurs. Utilisez std :: strtoi, ou mieux, std :: stoi. – PlasmaHH

+2

@PlasmaHH, Exactement, mais vous voulez dire «strtol». 'boost :: lexical_cast' pourrait aussi être une option. Il y a * une * question sur tout cela quelque part IIRC. – chris

+0

atoi ne pas signaler les erreurs semble bénéfique, il essaie de fonctionner même si quelque chose ne va pas, plutôt que de me lancer une exception et de quitter. De www.cplusplus.com, trouvé que atoi est bon parce que "garantie de non-lancer: cette fonction ne jette jamais des exceptions." – user2333388

Répondre

6

Le c_str méthode existe à cet effet.

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

BTW votre code devrait lire

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

Tout simplement parce que le fichier est 'bon' ne signifie pas la prochaine getline réussira, seulement que la dernière getline a réussi. Utilisez getline directement dans votre condition while pour savoir si vous avez effectivement lu une ligne.

+0

cela fonctionne - merci! D'ailleurs, toute idée pourquoi chaîne filename = "data.txt"; Le fichier ifstream (filename) échoue mais le fichier ifstream ("data.txt"); travaux? – user2333388

+1

Même solution 'ifstream file (filename.c_str());' Bien que je pense en C++ 11, vous pouvez aussi utiliser une chaîne. Il y a une conversion automatique de char * en chaîne, mais pas l'inverse. C'est ainsi que la classe de cordes a été conçue. – john

1

Utilisation line.c_str() au lieu de simplement line

Ce atoi prend un const char* pas std::string

2

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

Questions connexes