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