我们有一个文件,其中有一个 64 位整数作为字符串。我们如何 scanf() 或以其他方式将此数字字符串解析为 C++ 中的无符号 64 位整数类型?
我们知道诸如 %lld 之类的东西,但是执行此解析的许多方法似乎会破坏不同编译器和标准库下的编译。代码应该在 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()
或类似的。