从文件中读取64位整数字符串

3

我们有一个文件,其中包含一个64位整数的字符串。在C++中,如何使用scanf()或其他方法将此数字字符串解析为无符号64位整数类型?

我们知道像%lld等方式,但许多解析方法似乎会在不同编译器和stdlib下出现编译错误。代码应该在gcc和Microsoft C ++编译器下编译(当然,完全符合标准将是一个加分项)。

5个回答

5

GCC已经支持long long,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;

1
个人而言,我会使用 stdint.h 中的 uint64_t。它是 C99 标准,不是 C++,但在 GCC 中可以找到,并且您可以轻松地在线查找 VC++ 版本并将其添加到项目中。未来可能还适用于任何平台,如果我们幸运的话,它也会出现在 C++0x 中。 - Steve Jessop
它是使用C++0x编写的。虽然(u)int64_t实际上是可选的,但可以安全地假设它将适用于个人计算机。否则,可以使用uint_least64_t或uint_fast64_t。 - KTC

4

Alnitak建议使用strtoull(),但似乎在Win32环境中不可用。链接到的论坛帖子建议使用_strtoui64()_wcstoui64()_tcstoui64()中的任意一个作为替代方案。也许这是一些不能通过单个可移植函数调用完成的东西的边缘,你可能需要为不同平台实现不同的代码路径。或者,我猜,编写自己的ASCII-to-64位转换器,这并不是什么高深的科学。


3

或者利用 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;

2
std::fstream fstm( "file.txt" );
__int64 foo;
fstm >> foo;

1
不要使用scanf(),请将输入分词后再使用strtoull()或类似函数。

strtoull()在Windows本地是否受支持? - Thorsten79
你可以很容易地制作自己的。 - Artelius
1
公平地说,我确实说过“或类似的” :) - Alnitak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接