سؤال

ولدينا ملف يحتوي على عدد صحيح 64 بت كسلسلة في ذلك. كيف يمكننا scanf () أو تحليل هذه السلسلة الرقمية إلى 64 بت نوع عدد صحيح غير موقعة في C ++؟

ونحن ندرك الأشياء مثل٪ بكالوريوس في القانون وما إلى ذلك، ولكن الكثير من الطرق للقيام بذلك تحليل يبدو أن كسر بتجميع تحت المجمعين وstdlibs مختلفة. رمز يجب أن تجمع تحت دول مجلس التعاون الخليجي و Microsoft C ++ مترجم (لن الامتثال التام للمعايير بالطبع يكون زائدا)

هل كانت مفيدة؟

المحلول

لقد دول مجلس التعاون الخليجي منذ فترة طويلة طويلة، وكذلك المجمعين ل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()، ولكن يبدو انها ليست <وأ href = "http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/d69a6afe-6558-4913-afb0-616f00805229/" يختلط = "noreferrer نوفولو"> متوفرة في بيئات 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()، tokenize المدخلات بشكل منفصل ومن ثم استخدام strtoull() أو ما شابه ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top