3

文字列として 64 ビット整数を含むファイルがあります。C++ でこの数値文字列を unsigned 64 ビット整数型に scanf() またはその他の方法で解析するにはどうすればよいでしょうか?

%lld などのようなことは認識していますが、この解析を行う多くの方法は、異なるコンパイラや stdlib でコンパイルを中断するようです。コードは gcc および Microsoft C++ コンパイラでコンパイルする必要があります (もちろん、標準に完全に準拠していることが望ましいです)。

4

5 に答える 5

5

C++0x のコンパイラと同様に、GCC には長い歴史があります。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;
于 2008-10-31T10:45:30.550 に答える
4

Alnitak は を推奨strtoull()していますが、Win32環境では使用できないようです。リンク先のフォーラム スレッドでは_strtoui64()_wcstoui64()とのいずれかを_tcstoui64()代替として推奨しています。おそらく、これは単一の移植可能な関数呼び出しでは実際には実行できないものの「限界」にあり、プラットフォームごとに異なるコード パスを実装する必要があるかもしれません。または、独自の ASCII から 64 ビットへのコンバーターを作成すると思いますが、それはロケット科学ではありません。

于 2008-10-31T09:47:51.057 に答える
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;
于 2008-10-31T10:22:02.657 に答える
2
std::fstream fstm( "file.txt" );
__int64 foo;
fstm >> foo;
于 2008-10-31T10:24:22.077 に答える
1

を使用しないscanf()でください。入力を個別にトークン化してから、strtoull()または同様のものを使用してください。

于 2008-10-31T09:36:40.643 に答える