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
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;
N'utilisez pas scanf()
, marquez votre entrée séparément, puis utilisez strtoull()
ou similaire.
Est-ce que strtoull() est supporté sous Windows? – Thorsten79
Vous pouvez facilement créer le vôtre. – Artelius
Pour être juste, j'ai dit "ou similaire" :) – Alnitak
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.
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;
std::fstream fstm("file.txt");
__int64 foo;
fstm >> foo;
- 1. Appel code 32 bits à partir de 64 bits Processus
- 2. Comment enregistrer une DLL 64 bits (sur un système d'exploitation 64 bits) à partir d'une application 32 bits
- 3. Lecture du registre 64 bits à partir d'une application 32 bits
- 4. Oracle à partir de .Net avec un client 64 bits
- 5. Configuration du projet Installshield 64 bits
- 6. Mise à niveau 64 bits
- 7. Utilisation d'un pilote 64 bits à partir d'une application 32 bits
- 8. Pièges généraux lors du passage à Vista 64 bits?
- 9. Ciblage 64 bits
- 10. Comment lancer un processus Windows en 64 bits à partir d'un code 32 bits?
- 11. Frais généraux de 64 bits
- 12. Construction de bibliothèques 64 bits
- 13. Application java 64 bits à utiliser 32 bits dll
- 14. Chargement d'un processus 32 bits dans un environnement 64 bits
- 15. Dev .NET 32 bits par rapport à 64 bits prod
- 16. Comment utiliser un objet COM 32 bits à partir d'un processus 64 bits?
- 17. Comment compiler un fichier binaire 32 bits sur une machine Linux 64 bits avec gcc/cmake
- 18. SHGetFolderPath() 32 bits par rapport à 64 bits
- 19. dbxtool sur Linux 64 bits ne chargera pas la version 64 bits de dbx?
- 20. Comment créer une DLL .NET 64 bits avec l'interopérabilité COM 64 bits?
- 21. long sur une machine 64 bits
- 22. L'iPhone OS 64 bits ou 32 bits?
- 23. Détermination de Windows 64 bits vs 32 bits
- 24. Connexion à Oracle à partir de SSIS sur Vista 64 bits
- 25. Référez-vous à 'Program Files' sur une machine 64 bits
- 26. Remplacement de CMNewProfileSearch par du code 64 bits non obsolète
- 27. Forcer un service Windows .NET à s'exécuter en 32 bits sur une machine 64 bits
- 28. Chargement/interaction avec une DLL COM vb6 à partir d'une application 64 bits
- 29. Accès CSV via ADO.NET en 64 bits?
- 30. Ubuntu 64 bits vs 32 bits sur les systèmes à faible mémoire - pourquoi Ubuntu 64 bits mange ma RAM?
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. –
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