2013-05-13 6 views
2

Я начинаю программировать, и у меня есть проблема. Я хочу написать структуру в свой двоичный файл. И я не уверен в результате. Вот структура:Как должен выглядеть двоичный файл?

struct clientData 
{ 
    unsigned int id; 
    char name[25]; 
    char post[15]; 
    char degree[10]; 

    clientData(unsigned int, char*, char*, char*); 
}; 

Как вы можете видеть, моя структура содержит некоторые строки символов. Вот главный вопрос: Должны ли мои строки быть переконвертированы в окончательный двоичный файл (чтобы они не читались для приложений, таких как блокнот и т. Д.)? Потому что мой результат выглядит так (я не могу добавить изображения, так что я просто вставить его):

Miles Edgecombe МММММММММdocent ММММММММpew1 ммммммм

И это, как я пишу в двоичный файл:

ofstream binary_1st("binary_input.dat", ios::out | ios::binary); 
... 
binary_1st.write((char*) &cl, sizeof(clientData)); 
... 
binary_1st.close(); 
+0

Какой формат вы хотите в двоичном файле? –

+1

Как новичок, обычно проще вставлять в текстовый формат. – MSalters

+0

@MSalters Im student и моя задача - использовать двоичные файлы для хранения данных, поэтому я не могу этого избежать: D –

ответ

0

Вы пишете структуру файлов как есть, без сериализации или р ACKing. Таким образом, структура будет написана, как это, строки будут читаться (если они доступны для чтения в коде), цифры будут цифрами и т.д.

Кстати, это М-й в

Miles Edgecombe МММММММММdocent ММММММММpew1 МММММММ 

означают, что характер массивы в вашей структуре не обнуляются перед записью строк для них, поэтому в конце нет нулей в конце, и, таким образом, «thrash» будет записано в конце.

+0

Самое интересное в моих ситуациях - это то, что числа преобразуются и нечитаемы (первый символ с идентификатором нечитабелен и не может быть вставлен здесь) –

+0

Это потому, что текстовый редактор пытается представить ваш номер как символ ascii (или в соответствии с кодировкой задавать). И если это число не является допустимым символьным кодом, оно не будет отображаться правильно в текстовом режиме. Однако hex-editor покажет вам реальное значение. – maverik

+0

Вот почему я был в замешательстве. Редактор HEX показывает мне шестнадцатеричное значение, но строки не изменились вообще :) –

0

Должны ли мои строки быть преобразованы в окончательный двоичный файл (так что они нечитабельно для приложений, таких как блокнот и т. Д.)? Потому что мой результат выглядит вроде этого (я не могу добавить изображения, так что я просто вставить его):

Не беспокойтесь об этом. Вероятно, ваши строки не содержат новых строк. Любой код, который преобразует двоичный код в текстовый формат, должен беспокоиться о Notepad & c.

Возможно, вы не должны изобретать свой собственный двоичный формат. Но если вы действительно должны, то следите за следующим.

  • Убедитесь, что содержит информацию о версии.
  • Прочтите данные о размерах данных, возможно, замените это int на что-то с фиксированным размером 32 или 64 бит.
  • Храните целые числа byte-for-byte, чтобы иметь фиксированные endiannes. См. http://linux.die.net/man/3/htons.
  • Использовать фиксированную строку, закодированную. UTF-8.
  • Убедитесь, что вы знаете, как заканчиваются ваши строки. Либо придерживайтесь размера перед ними, либо выпишите NUL-байт после строки (в этом примере кода нет).

обновление: Я просто заметил, что мой ответ был, вероятно, не очень понятно, для начинающих, но я не хочу, чтобы сделать это в эссе. Главное, что хранение struct verbatim, вероятно, не очень хорошая идея.Если вам нужна дополнительная информация об остальных, спросите пожалуйста.

+0

Я очень сомневаюсь, что OP действительно понадобится все это для его простой игры. Хотя да, эти моменты важны при создании портативного двоичного формата, это действительно не обязательно, если вы просто сохраняете незначительное состояние. –

+0

@ RichardJ.RossIII Если вы просто сохраняете второстепенное состояние, более подходящим является текстовый формат. Если вы хотите, чтобы вы могли читать данные позже, то вам нужно следовать рекомендациям Адриана. –

+0

Исправить. Хотя, если OP играет, он должен, вероятно, придерживаться текста. Проще всего разобрать, чем двоичный, но это более полезно. –

0

Вам необходимо написать данные в виде текста, если вы хотите, чтобы его можно было прочитать в NotePad. Используйте оператор << и перегрузите его, как представлять данные.

Для записи данных в виде текста:

std::ostream& operator<<(std::ostream& os, const clientData& obj) 
{ 
    os << obj.id << " " << obj.name << " " << obj.post << " " << obj.degree; 
    return os; 
} 

... 

binary_1st << cl << std::endl; 

В противном случае у вас есть данные + некоторые нечитаемые кодированные данные. Даже вы увидите мусор в файле, если строка, хранящаяся в char [], имеет длину меньше размера массива.

+0

На самом деле я хочу, чтобы Im правильно использовал двоичные файлы (я должен использовать BINARY FILE для хранения моих данных), но я не был уверен, что это из-за читаемых строк. Извините за мой английский, надеюсь, вы поняли :) –

+0

ios :: binary - это только вариант формата (если я могу назвать это так) потоку. Это не автоматическое создание двоичного файла для вас. Вы можете выбрать формат. – maverik

+0

@AlesDokshanin: Когда вы записываете данные в файл как двоичные, это может быть читаемым (например, символьные последовательности). Поэтому не беспокойтесь об этом. Если вы хотите, чтобы записанные данные были нечитаемыми, попробуйте зашифровать или закодировать их перед записью. – deepmax

Смежные вопросы