파일에서 64 비트 정수 문자열을 읽으십시오
문제
64 비트 정수가 문자열로있는 파일이 있습니다. C ++의 서명되지 않은 64 비트 정수 유형 으로이 숫자 문자열을 구문 분석하는 방법은 무엇입니까?
우리는 %lld 등과 같은 것을 알고 있지만,이 구문 분석을 수행하는 많은 방법은 다른 컴파일러와 stdlibs에서 컴파일을 깨는 것 같습니다. 코드는 GCC와 Microsoft C ++ 컴파일러에 따라 컴파일해야합니다 (물론 표준 준수는 플러스 일 것입니다)
해결책
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;
다른 팁
Alnitak은 추천합니다 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()
또는 유사합니다.
제휴하지 않습니다 StackOverflow