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)

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top