2011-09-12 27 views
1

私自身のファイル形式を作成しようとしています。私は画像ファイル とそのファイルにテキストの説明を保存したいと思います。1つに複数のファイルがあります

image_file_size 
image_data 
desctiption_file_size 
description_data 

しかし、 '\ n' の記号なし: ファイル形式は、そのようなことになります。 そのために私はstd :: ios :: binaryを使用しています。ここにいくつかのコードがあります。 はそのプロセスを記述しています(スケッチであり、最後の変種ではありません): 私のファイルを書きます。

long long image_length, desctiption_length; 

std::fstream m_out(output_file_path, std::ios::out | 
std::ios::binary); 
std::ifstream input_image(m_image_file_path.toUtf8().data()); 

input_image.seekg(0, std::ios::end); 
image_length = input_image.tellg(); 
input_image.seekg(0, std::ios::beg); 

// writing image length to output file 
m_out.write((const char *)&image_length, sizeof(long long)); 

char *buffer = new char[image_length]; 
input.read(buffer, image_length); 

// writing image to file 
m_out.write(buffer, image_length); 

// writing description file the same way 
// ... 

マイファイルを読み込んでいます。

std::fstream m_in(m_file_path.toUtf8().data(), std::ios::in); 

long long xml_length, image_length; 

m_in.seekg(0, std::ios::beg); 
m_in.read((char *)&image_length, sizeof(long long)); 
m_in.seekg(sizeof(long long)); 

char *buffer = new char[image_length]; 
m_in.read(buffer, image_length); 

std::fstream fs("E:\\Temp\\out.jpg"); 
fs.write(buffer, image_length); 

画像(E:\ Temp \ out.jpg)が壊れています。私は16進数でそれを見ている エディタといくつかの余分なビットがあります。

誰かが私を助け、私が間違っていることを伝えることができますか?

+0

のアーカイブを再発明していますか?既存のzip/tar/cpio /どんなフォーマットを使用することはできませんか?また、[EXIFタグ](http://en.wikipedia.org/wiki/Exchangeable_image_file_format)を参照してください。 – sehe

+0

はい、私はその目的のためにzipとtarライブラリを試していますが、実際にはうまくいっていない作品やクロスプラットフォームのライブラリが見つかりませんでした。 私はlibzipを試していましたが、勝利しても動作しませんでした。また、私はタールを試していますが、libtarは私にとってはほとんど理解できません。たぶん私はそのようにしてもっと試してみる必要があります。 – fryme

+0

[PoCo](http://pocoproject.org/docs/ZipUserGuide.html)、[ZipArchive](http://www.viksoe.dk/code/ziparchive.htm)を参照してください。あなたもここで:http://stackoverflow.com/questions/505863/how-do-i-zip-a-directory-of-files-using-c/505984#505984 – sehe

答えて

3

すべてのバイナリデータを保存して読み込むので、すべてファイルを開いてバイナリモードで作成する必要があります。書き込み部分で

:読み取り部には

std::ifstream input_image(m_image_file_path.toUtf8().data(), std::ios::in | std::ios::binary); 

std::fstream m_in(m_file_path.toUtf8().data(), std::ios::in | std::ios::binary); 

//... 

std::fstream fs("E:\\Temp\\out.jpg", std::ios::out | std::ios::binary); 
+0

彼はバイナリですべてを開くべきであることは事実です。しかし、バイナリで開かないと、通常、一部のデータがeofとして検出され、データが失われます。 OPはあなたの解決策が取り組まない_余分なビットを観測しています。 – Shahbaz

+0

本当に役に立ちました。どうもありがとうございました! – fryme

関連する問題