2017-08-25 33 views
-1

這個問題的一個載體,對如何在std::vector寫入文件很好的答案:Reading and writing a std::vector into a file correctly文件的I/O陣列

在我的情況,我有陣列的載體:

vector<array<double, 3> > vec; 

我想寫入,以便一個文件,以獲得具有以下格式,其中的值是加倍並且第一個數字是在載體中的位置,第二個是在陣列中的位置的文件:

vec0_0 vec0_1 vec0_2 vec1_0 vec1_1 vec1_2 vec2_0 ... 

我可以只使用...

std::copy(vec.begin(), vec.end(), std::ostreambuf_iterator<char>(FILE)); 

......或者......

size_t sz = vec.size(); 
FILE.write(reinterpret_cast<const char*>(&vec[0]), sz * sizeof(vec[0])); 

...如提到的問題,提出了一個標量類型,或做我需要做的它有所不同,因爲vector中的類型是array

+0

你是什麼意思_safe_? – user0042

+0

@ user0042:現在快樂嗎? ;-) – Michael

+1

你爲什麼不簡單地嘗試?應該工作... – user0042

回答

1

據我所知,std :: array有連續的存儲空間。但是,我不認爲沒有填充保證。如果這只是一個雙[3],它會開箱即用,但我認爲你必須非常仔細地測試,並擔心容器內的std :: array的可移植性。

事實上,環顧這裏已經有一個系統的墊子。

std::array alignment

sizeof(int) = 4; 
sizeof(std::tr1::array< int,3 >) = 16; 
sizeof(std::tr1::array< int,4 >) = 16;  
sizeof(std::tr1::array< int,5 >) = 32; 

這大概填充,實現定義,或者你可以在標準的地方找到它。無論如何,我只是迭代該事物或使用非stl數組。

我猜這個概念類似於struct,其中經常會使用填充來優化內存訪問,但是編譯器正在優化該填充,並且可以在大多數編譯器上使用#pragma pack語句關閉該概念。據我所知,這不適用於stl容器。

+0

如果使用反向代碼從該文件中獲取值, (讓我們假設相同的目標平臺和編譯器) – user0042

+0

@ user0042:否,填充或任何其他數據在這種情況下無關緊要。但是我要求在問題中提供特定的結果文件佈局。 – Michael

+0

是的,底線,你可能不需要一次寫完所有東西,除非你的分析器告訴你這是你應用程序的瓶頸。如果它不知何故是熱點,老闆正在呼吸你的脖子,我會重構並在內部使用非stl類型。沒有傷害沒有犯規。否則,有利於可讀性和可維護性,這樣下一個人就不需要弄清楚什麼是魔術填充無意義了。 – Josh