2008-10-31 10 views
3

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

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

ответ

5

GCC уже давно долго, как будет компиляторы для 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; 
1

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

+0

Поддерживается ли strtoull() в Windows? – Thorsten79 2008-10-31 09:40:01

+0

Вы можете легко сделать свой собственный. – Artelius 2008-10-31 09:47:57

4

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

3

Или использовать типобезопасность из 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
std::fstream fstm("file.txt"); 
__int64 foo; 
fstm >> foo;