문제

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() 또는 유사합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top