2011-09-10 6 views
1

J'ai quelques lignes d'information d'un fichier de données en C++. Une information est un nombre long de 12 caractères. Comment puis-je convertir cela de la chaîne à long long (je pense que longtemps est le plus approprié pour cela) sans perte de données?Convertir une chaîne ASCII en long long

Répondre

5

En C++, il n'y a pas de type de données long long. It's available in C99. Cependant, vous pouvez utiliser int64_t. Inclure <stdint.h>. Utilisez boost::lexical_cast pour convertir la chaîne en int64_t.

Ou vous pouvez écrire une fonction de conversion vous-même comme:

int64_t convert(const std::string &s) 
{ 
    if(s.size() == 0) 
     std::runtime_error error("invalid argument"); 
    int64_t v = 0; 
    size_t i=0; 
    char sign = (s[0] == '-' || s[0] == '+') ? (++i, s[0]) : '+'; 
    for(; i < s.size(); ++i) 
    { 
     if (s[i] < '0' || s[i] > '9') 
      throw std::runtime_error("invalid argument"); 
     v = v * 10 + s[i] - '0'; 
    } 
    return sign == '-' ? -v : v; 
} 

Code d'essai:

int main() { 
     try{ 
      std::cout << convert("68768768") << std::endl; 
      std::cout << convert("+68768768") << std::endl; 
      std::cout << convert("-68768768") << std::endl; 
      std::cout << convert("68768768x") << std::endl; 
     }catch(const std::exception &e) 
     { 
      std::cout << e.what() << std::endl; 
     } 
     return 0; 
} 

Sortie:

68768768 
68768768 
-68768768 
invalid argument 

Démo en ligne: http://ideone.com/nnSLp

0

Un entier de 64 bits est suffisant pour représenter n'importe quel nombre décimal à 12 chiffres (avec beaucoup d'espace disponible). Ainsi, en fonction de votre plate-forme, il se peut qu'un long suffise. Si c'est le cas, vous pouvez utiliser strtol ou strtoul. Si vous trouvez que vous avez besoin d'un long long, jetez un oeil à strtoll et strtoull.

+3

je dirais que 90% il va fi sd sur sa plate-forme 'long' pour être seulement 32 bits à moins qu'il ne compile avec GCC pour les systèmes 64 bits (ou d'autres compilateurs plus particuliers) – xanatos

+1

Cela dit, vous pouvez mentionner' strtol'/'strtoul' pour une utilisation avec des longs ordinaires. . –