题
我们有一个64位整数作为字符串的文件。我们如何scanf()或以其他方式将此数字字符串解析为C ++中的无符号64位整数类型?
我们知道像%lld这样的东西,但很多方法做这个解析似乎打破了不同编译器和stdlibs下的编译。代码应该在gcc和Microsoft C ++编译器下编译(当然完全符合标准是一个优点)
解决方案
GCC和C ++ 0x的编译器一样长。 MSVC ++(尚未),但确实有__int64可以使用。
#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;
其他提示
Alnitak推荐 strtoull()
,但似乎不是在Win32 环境中可用。链接论坛主题建议将 _strtoui64()
, _wcstoui64()
和 _tcstoui64()
作为替换。也许这是“在边缘”。一些便携式函数调用无法完成的事情,您可能需要为不同的平台实现不同的代码路径。或者,我想,编写自己的ASCII到64位转换器,它不是火箭科学。
或者使用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;
不要使用 scanf()
,单独标记输入,然后使用 strtoull()
或类似的。
不隶属于 StackOverflow