2008-10-31 4 views
3

Nous avons un fichier qui contient un entier de 64 bits en tant que chaîne. Comment scanf() ou sinon analyser cette chaîne numérique dans un type entier 64 bits non signé en C++? Nous sommes conscients de choses comme% lld etc., mais beaucoup de façons de faire cette analyse semblent casser les compilations sous différents compilateurs et stdlibs. Le code doit compiler sous gcc et le compilateur Microsoft C++ (bien sûr, la conformité totale aux normes serait un plus)Lit une chaîne d'entier de 64 bits à partir du fichier

Répondre

5

GCC a long long, tout comme pour les compilateurs C++ 0x. MSVC++ n'a pas (encore), mais a son __int64 que vous pouvez utiliser.

#if (__cplusplus > 199711L) || defined(__GNUG__) 
    typedef unsigned long long uint_64_t; 
#elif defined(_MSC_VER) || defined(__BORLANDC__) 
    typedef unsigned __int64 uint_64_t; 
#else 
#error "Please define uint_64_t" 
#endif 

uint_64_t foo; 

std::fstream fstm("file.txt"); 
fstm >> foo; 
+1

Personnellement, j'utiliserais uint64_t de stdint.h. C'est un standard C99, pas C++, mais c'est dans GCC et vous pouvez facilement trouver les versions VC++ en ligne et les placer dans votre projet. Il en va de même pour la plate-forme J. Random à l'avenir, et si nous avons de la chance, ce sera en C++ 0x. –

+0

Il est en C++ 0x. Bien que (u) int64_t soit réellement optionnel, on peut supposer qu'il sera disponible pour les PC. Sinon, on peut utiliser uint_least64_t ou uint_fast64_t. – KTC

1

N'utilisez pas scanf(), marquez votre entrée séparément, puis utilisez strtoull() ou similaire.

+0

Est-ce que strtoull() est supporté sous Windows? – Thorsten79

+0

Vous pouvez facilement créer le vôtre. – Artelius

+1

Pour être juste, j'ai dit "ou similaire" :) – Alnitak

4

Alnitak recommande strtoull(), mais il semble que ce ne soit pas available in Win32 environnements. Le fil de discussion lié au forum recommande soit _strtoui64(), _wcstoui64() et _tcstoui64() comme remplacements. Peut-être est-ce «à la limite» des choses qui ne peuvent pas vraiment être faites avec un seul appel de fonction portable, et vous pourriez avoir besoin d'implémenter des chemins de code différents pour différentes plates-formes. Ou, je suppose, écrire votre propre convertisseur ASCII-à-64-bit, ce n'est pas sorcier.

3

Ou utilisez le istream ... de Sûreté du typage

using namespace std; 

    // construct a number -- generate test data 
    long long llOut = 0x1000000000000000; 
    stringstream sout; 
    // write the number 
    sout << llOut; 
    string snumber = sout.str(); 
    // construct an istream containing a number 
    stringstream sin(snumber); 

    // read the number -- the crucial bit 
    long long llIn(0); 
    sin >> llIn; 
2
std::fstream fstm("file.txt"); 
__int64 foo; 
fstm >> foo; 
Questions connexes