Ну, в качестве простого примера, давайте возьмем растровые изображения.
Растровые изображения имеют стандартную файловую структуру, которая определяется информационным заголовком и заголовком файла.
В статье в википедии (ссылка: http://en.wikipedia.org/wiki/BMP_file_format) вы увидите, что заголовок информации имеет четко определенный формат, а также заголовок файла.
Каждый из них записывается в двоичном виде как есть, и читается в двоичном виде как есть. Затем собственно растровое изображение записывается в двоичном виде.
В других приложениях приложение может выбрать собственный настраиваемый текстовый формат, и в этом случае он должен быть записан согласованным образом или иметь некоторую поддержку управления версиями, чтобы вы могли использовать более новые функции в файле.
Посмотрите на сериализацию, это довольно широкая тема, и к этому есть множество подходов.
Редактировать: Вот пример кода (не оптимальный) для чтения (или записи с правильными изменениями) в растровых изображениях:
// Tell visual studio to align on 2-byte boundary
// Necessary so if you write to file, it only writes 14 bytes and not 16.
#pragma pack(2)
struct BMIH
{
short bfType;
long bfSize;
short bfReserved0;
short bfReserved1;
long bOffbits;
};
#pragma pack(8)
struct BMFH
{
long biSize;
long biWidth;
long biHeight;
short biPlanes;
short biBitCount;
long biCompression;
long biImageSize;
long biXPelsPerMeter;
long biYPelsPerMeter;
long biClrUsed;
long biClrImportant;
};
BMIH infoheader;
BMFH fileheader;
std::fstream file(filename.c_str(), std::ios::in | std::ios::binary);
// Read in info and file headers
file.read((char *) &infoheader, sizeof(infoheader));
file.read((char *) &fileheader, sizeof(fileheader));
// Calculate size of image
int size = fileheader.biHeight * fileheader.biWidth;
int bytes = size * fileheader.biBitCount / 8;
// Read in the image to a buffer
unsigned char data = new unsigned char[bytes];
file.read((char *) td.data, bytes);
file.close();
Этот код на самом деле является радикальным упрощением и полностью игнорирует всевозможные проблемы, например, что происходит, если заголовки файлов или данные повреждены, если файл не является неполным, и т. Д. Но он просто предназначен для подтверждения концепции , На самом деле #pragmas - это визуальная студия, специально предназначенная для правильного выравнивания заголовков.
Когда мы записываем это в файл, мы можем фактически не сказать «Хорошо, теперь запишите это целое число». Вместо этого мы хотим записать его в двоичном формате. Например, код, который вы можете (но не должен) использовать для написания, будет выглядеть так:
// Assume for arguments sake these data structures came pre-filled
BMFH fileheader;
BMIH infoheader;
unsigned char *data;
int size = fileheader.biHeight * fileheader.biWidth;
int bytes = size * fileheader.biBitCount / 8;
std::fstream file("MyImage.bitmap", std::ios::out | std::ios::binary);
file.write((char *) &infoheader, sizeof(BMIH));
file.write((char *) &fileheader, sizeof(BMFH));
file.write((char *) data, sizeof(unsigned char) * bytes);