Search code examples
c++imagebinaryfile-format

Multiple files in one


I'm trying to create my own file format. I want to store image file and some text description in that file. File format will be something like that:

image_file_size
image_data
desctiption_file_size
description_data

But without '\n' symbols. For that purpose i'm using std::ios::binary. Here is some code, describes that process (it is sketch, not last variant): Writing my file.

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
// ...

Reading my file.

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);

And now image (E:\Temp\out.jpg) is broken. I'm watching it in hex editor and there are some extra bits.

Can somebody help me and tell what i'm doing wrong?


Solution

  • Since you are storing and reading binary data everywhere, you should open and create all files in binary mode.

    In the write part:

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

    In the read part:

    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);