Pregunta

Tenemos un archivo que tiene un entero de 64 bits como una cadena. ¿Cómo escaneamosf () o, de lo contrario, analizamos esta cadena numérica en un tipo entero sin signo de 64 bits en C ++?

Somos conscientes de cosas como% lld, etc., pero muchas formas de hacer este análisis parecen romper compilaciones bajo diferentes compiladores y stdlibs. El código debe compilarse bajo gcc y el compilador de Microsoft C ++ (por supuesto, el cumplimiento total con los estándares sería una ventaja)

¿Fue útil?

Solución

GCC tiene mucho tiempo, al igual que los compiladores para C ++ 0x. MSVC ++ no (todavía), pero tiene su __int64 que puede 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;

Otros consejos

Alnitak recomienda strtoull () , pero parece que no es disponible en entornos Win32 . El hilo del foro vinculado a recomienda como _strtoui64 () , _wcstoui64 () y _tcstoui64 () como reemplazos. Quizás esto está " en el borde " de cosas que realmente no se pueden hacer con una sola llamada de función portátil, y es posible que necesite implementar diferentes rutas de código para diferentes plataformas. O, supongo, escribe tu propio convertidor de ASCII a 64 bits, no es ciencia espacial.

O usa los tipos de seguridad 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;

No use scanf () , tokenice su entrada por separado y luego use strtoull () o similar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top