Pergunta

Temos um arquivo que tem um inteiro de 64 bit como uma string no mesmo. Como podemos scanf () ou de outra forma analisar essa seqüência numérica em um tipo inteiro de 64 bits sem sinal em C ++?

Estamos cientes de coisas como% lld etc., mas um monte de maneiras de fazer isso parse parecem quebrar compila sob diferentes compiladores e stdlibs. O código deve compilar sob gcc e compilador do Microsoft C ++ (claro plena conformidade com as normas seria um plus)

Foi útil?

Solução

GCC tem longa, longa, como compiladores para C ++ 0x. MSVC ++ não (ainda), mas tem a sua __int64 você pode usar.

#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;

Outras dicas

Alnitak recomenda strtoull(), mas parece que não é disponível em ambientes Win32 . O ligado-to fórum de discussão recomenda qualquer um _strtoui64(), _wcstoui64() e _tcstoui64() como substitutos. Talvez esta seja "à beira" de coisas que realmente não pode ser feito com uma única chamada de função portátil, e pode ser necessário para implementar diferentes caminhos de código para diferentes plataformas. Ou, eu acho, escrever seu próprio conversor de ASCII-to-64-bit, não é ciência do foguete.

Ou use o typesafety de 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;

Não use scanf(), tokenizar sua entrada separada e, em seguida, usar strtoull() ou similar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top