Frage

Wir haben eine Datei, die eine 64-Bit-Integer als String in ihm hat. Wie scanf wir () oder sonst diese Ziffernfolge in einen nicht signierten 64-Bit-Integer-Typen in C ++ analysieren?

Wir sind uns bewusst, Dinge wie% lld etc., aber viele Möglichkeiten, diese Parse zu tun scheinen kompiliert unter verschiedenen Compilern und STDLIBS zu brechen. Der Code sollte unter gcc kompilieren und das Microsoft C ++ Compiler (natürlich volle Übereinstimmung mit den Normen wäre ein Plus)

War es hilfreich?

Lösung

GCC hat lange, lange, ebenso wie Compiler für C ++ 0x. MSVC ++ funktioniert (noch) nicht, aber hat seine __int64 Sie verwenden können.

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

Andere Tipps

Alnitak empfiehlt strtoull(), aber es scheint, es ist nicht verfügbar in Win32 Umgebungen. Die verlinkten zum Forum Thread empfiehlt entweder von _strtoui64(), _wcstoui64() und _tcstoui64() als Ersatz. Vielleicht ist dies „am Rande“ von Sachen, die nicht wirklich mit einem einzigen tragbaren Funktionsaufruf durchgeführt werden können, und Sie können verschiedene Codepfade für verschiedene Plattformen implementieren müssen. Oder ich denke, schreiben Sie Ihre eigenen ASCII-zu-64-Bit-Wandler, es ist kein Hexenwerk.

Oder verwenden Sie die Typsicherheit von 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;

Verwenden Sie scanf() nicht, tokenize Ihre Eingabe separat und verwenden Sie dann strtoull() oder ähnliches.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top