2008-10-31 83 views
3

我們有一個文件,其中包含64位整數作爲字符串。我們如何scanf()或以其他方式將此數字字符串解析爲C++中的無符號64位整數類型?從文件中讀取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到64位轉換器,這不是火箭科學。

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;