【发布时间】:2008-10-31 09:32:59
【问题描述】:
我们有一个文件,其中包含一个 64 位整数作为字符串。我们如何 scanf() 或以其他方式将此数字字符串解析为 C++ 中的无符号 64 位整数类型?
我们知道诸如 %lld 之类的东西,但是执行此解析的许多方法似乎会破坏不同编译器和标准库下的编译。代码应在 gcc 和 Microsoft C++ 编译器下编译(当然完全符合标准将是一个加分项)
【问题讨论】:
标签: c++ parsing 64-bit integer
我们有一个文件,其中包含一个 64 位整数作为字符串。我们如何 scanf() 或以其他方式将此数字字符串解析为 C++ 中的无符号 64 位整数类型?
我们知道诸如 %lld 之类的东西,但是执行此解析的许多方法似乎会破坏不同编译器和标准库下的编译。代码应在 gcc 和 Microsoft C++ 编译器下编译(当然完全符合标准将是一个加分项)
【问题讨论】:
标签: c++ parsing 64-bit integer
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(),但似乎不是available in 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() 或类似名称。
【讨论】: