文字列として 64 ビット整数を含むファイルがあります。C++ でこの数値文字列を unsigned 64 ビット整数型に scanf() またはその他の方法で解析するにはどうすればよいでしょうか?
%lld などのようなことは認識していますが、この解析を行う多くの方法は、異なるコンパイラや stdlib でコンパイルを中断するようです。コードは gcc および Microsoft C++ コンパイラでコンパイルする必要があります (もちろん、標準に完全に準拠していることが望ましいです)。
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;
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()
または同様のものを使用してください。