Читать 64-битную целочисленную строку из файла - PullRequest
3 голосов
/ 31 октября 2008

У нас есть файл с 64-битным целым числом в виде строки. Как мы можем выполнить scanf () или иным образом проанализировать эту числовую строку в 64-разрядном целочисленном типе без знака в C ++?

Мы знаем о таких вещах, как% lld и т. Д., Но многие способы такого анализа, похоже, нарушают компиляцию под разными компиляторами и stdlibs. Код должен компилироваться под gcc и компилятором Microsoft C ++ (конечно, полное соответствие стандартам было бы плюсом)

Ответы [ 5 ]

5 голосов
/ 31 октября 2008

GCC имеет long long, как и компиляторы для 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;
4 голосов
/ 31 октября 2008

Alnitak рекомендует strtoull(), но, похоже, он не доступен в средах Win32 . Связанная с форумом ветка рекомендует в качестве замены _strtoui64(), _wcstoui64() и _tcstoui64(). Возможно, это «на грани» вещей, которые на самом деле нельзя сделать с помощью одного переносимого вызова функции, и вам может потребоваться реализовать разные пути кода для разных платформ. Или, я думаю, написать свой собственный ASCII-64-битный конвертер, это не ракетостроение.

3 голосов
/ 31 октября 2008

Или используйте тип безопасности 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;
2 голосов
/ 31 октября 2008
std::fstream fstm( "file.txt" );
__int64 foo;
fstm >> foo;
1 голос
/ 31 октября 2008

Не используйте scanf(), токенизируйте ввод отдельно, а затем используйте strtoull() или аналогичный.

...