Lire la chaîne entière 64 bits du fichier
Question
Nous avons un fichier qui contient un entier de 64 bits sous forme de chaîne. Comment scannons-nous (ou autrement analysons-nous cette chaîne numérique) en un type entier non signé de 64 bits en C ++?
Nous sommes au courant de choses comme% lld, etc., mais de nombreuses façons de procéder à cette analyse semblent rompre la compilation sous différents compilateurs et stdlibs. Le code devrait compiler sous gcc et le compilateur Microsoft C ++ (bien entendu, une conformité totale aux normes serait un plus)
La solution
GCC a longtemps été comme les compilateurs pour C ++ 0x. MSVC ++ ne l’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;
Autres conseils
Alnitak recommande strtoull ()
, mais il semble que ce ne soit pas disponible dans les environnements Win32 . Le fil de discussion lié au forum recommande de remplacer _strtoui64 ()
, _wcstoui64 ()
et _tcstoui64 ()
. Peut-être que c'est "sur le bord" de choses qui ne peuvent pas vraiment être faites avec un seul appel de fonction portable, et vous devrez peut-être implémenter différents chemins de code pour différentes plates-formes. Ou, je suppose, écrivez votre propre convertisseur ASCII vers 64 bits, ce n’est pas sorcier.
Ou utilisez le typeafety d'istream ...
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;
std::fstream fstm( "file.txt" );
__int64 foo;
fstm >> foo;
N'utilisez pas scanf ()
, identifiez séparément votre entrée, puis utilisez strtoull ()
ou similaire.