質問

文字列として64ビット整数を含むファイルがあります。 scanf()を実行する、またはこの数値文字列をC ++の符号なし64ビット整数型に解析する方法を教えてください。

%lldなどのようなものを認識していますが、この解析を行う多くの方法は、異なるコンパイラとstdlibsの下でコンパイルを中断するようです。コードはgccおよびMicrosoft 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()などを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top