English 中文(简体)
从文件中读取64位整数字符串
原标题:
  • 时间:2008-10-31 09:32:59
  •  标签:

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

我们知道 %lld 等东西,但是很多解析方法似乎会在不同的编译器和标准库下出问题。代码应该在gcc和微软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()或类似的方法。





相关问题
热门标签