2016-07-19 74 views
0

我在文件上寫入了一些信息,尤其是unsigned int。 後來的另一個程序去閱讀這些信息。 問題是這個第二個程序非常慢。 我介紹它,花50%的時間來做atoi。如何在讀取文件時避免atoi

有沒有寫在文件中的無符號整型避免的atoi 辦法(?二進制序列化?)

PS:我使用mmap的讀取

編輯:

我看到你響應和看起來最好的解決方案是把int的二進制內容放在文件中

+3

嘗試使用fstream讀取格式化輸入? – Arunmu

+1

[BOOST serialization !!!!](http://www.boost.org/doc/libs/1_61_0/libs/serialization/doc/index.html) –

+0

您是否通過將數據讀入固定緩衝區來最小化內存分配? –

回答

1

atoi()仍然比使用字符串流更快。但是,使用字符串流來執行此操作是跨C++類型安全和標準的唯一方法。

既要類型安全又要標準化,並且比字符串流或像atoi()或strtoul()這樣的東西要快的最好方法是使用Boost庫的約定來實現它。

Boost lexical_cast速度快,類型安全。

編輯:下午2:07 2016年7月19日

在你的情況,如果你寫在二進制模式的文件,你可以完全跳過此。真的回到基本的東西,如...

ofstream fout; 
fout.open("example.bin", ios::binary | ios::out | ios::trunc); 

unsigned int int_out; 
for(int i=0; i< someArray.length; ++i) { 
int_out = someArray[i]; 
fout.write((char*)&int_out, sizeof(unsigned int)); 
} 

然後,你可以閱讀它在另一端幾乎相同的方式。但使用...

ifstream fin; 
fin.open("example.bin", ios::binary); 

unsigned int int_in; 
for(int i=0; i< someArray.length; ++i) { 
fout.read((char*)&int_in, sizeof(unsigned int)); 
someArray[i] = int_in; 
} 
+0

我不能使用字符串streans我有一個長字符*的所有文件(該文件是mmap),你有另一種解決方案,而不是將insigned int寫入二進制添加以獲得它與鑄造? – Fractale

+0

好的,我用另一種方式編輯它以二進制。 –

+0

謝謝@Jeremy Gamet – Fractale

2

我會看看strtoul()。 與atoi()相比,它還具有錯誤處理的優點。

相關問題