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

时间:2008-10-31 09:33:00

标签: c++ parsing 64-bit integer

我们有一个64位整数作为字符串的文件。我们如何scanf()或以其他方式将此数字字符串解析为C ++中的无符号64位整数类型?

我们知道像%lld这样的东西,但很多方法做这个解析似乎打破了不同编译器和stdlibs下的编译。代码应该在gcc和Microsoft C ++编译器下编译(当然完全符合标准是一个优点)

5 个答案:

答案 0 :(得分:5)

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;

答案 1 :(得分:4)

Alnitak建议strtoull(),但似乎不是available in Win32环境。链接论坛主题推荐_strtoui64()_wcstoui64()_tcstoui64()作为替换。也许这对于单个可移植函数调用无法实现的东西“边缘”,您可能需要为不同平台实现不同的代码路径。或者,我想,编写自己的ASCII到64位转换器,它不是火箭科学。

答案 2 :(得分: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;

答案 3 :(得分:2)

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

答案 4 :(得分:1)

请勿使用scanf(),单独标记您的输入,然后使用strtoull()或类似内容。