Читать 64-битную целочисленную строку из файла
Вопрос
У нас есть файл с 64-битным целым числом в виде строки. Как мы можем выполнить scanf () или иным образом проанализировать эту числовую строку в 64-разрядном целочисленном типе без знака в C ++? Р>
Мы знаем о таких вещах, как% lld и т. д., но многие способы такого анализа, похоже, нарушают компиляцию под разными компиляторами и stdlibs. Код должен компилироваться под gcc и компилятором Microsoft C ++ (конечно, полное соответствие стандартам было бы плюсом)
Решение
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;
Другие советы
Альнитак рекомендует strtoull ()
, но, похоже, это не доступно в средах 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 ()
, токенизируйте ввод отдельно, а затем используйте strtoull ()
или подобное.