2012-08-16 2 views
0

код выглядит следующим образом:записи в файл в двоичном режиме

struct Dog { 
    string name; 
    unsigned int age; 
}; 

int main() 
{ 
    Dog d = {.age = 3, .name = "Lion"}; 
    FILE *fp = fopen("dog.txt", "wb"); 
    fwrite(&d, sizeof(d), 1, fp); //write d into dog.txt 
} 

Моя проблема в том, что точка написать объект данных или структуру в виде двоичного файла? Я предполагаю, что это делается для того, чтобы данные, сгенерированные в текущей программе, были постоянными, правильно? Если да, то как я могу вернуть данные? Использование fread?

Это заставляет меня думать о базе данных, как базе данных, записывать данные на диск так же?

+0

Вы действительно говорите о C? Что такое тип строки? – olivecoder

ответ

2

Вы можете сделать это, но у вас будет много вопросов, чтобы заботиться о:

  • типов конструкций: все ваши данные должны действительно быть в struct или вы можете просто написать указатель на другое место.
  • Изменения структуры: если вам нужно изменить структуру, вам понадобится написать конвертер для чтения старой структуры и написать новое.
  • язык совместимости: будет трудно получить доступ к данным с использованием другого языка

Это была обычная практика в первые дни до реляционных баз данных популяризации. Вы можете сделать индексные файлы, указывающие на номер записи.

Однако в настоящее время я советую вам сделать сериализацию и написать строки вместо двоичных файлов.

ПРИМЕЧАНИЕ: если строка является чем-то вроде гольца [40] ваш код может быть выживет ... но если ваш вопрос о C++ и строка является класс, то убить вас ребенком, прежде чем он вырастет! Символы строковых объектов не входят в вашу структуру, а в кучу.

+0

Зачем писать строки вместо двоичных файлов? – Alcott

+0

Запись строк в формате нефиксированного формата (csv, Jason, XML ...) возвращает все претензии выше в вашу пользу. Дело в том, что тип строки C++ будет в порядке, будет проще добавлять новые атрибуты и интегрироваться с любым другим языком. – olivecoder

2

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

Это всего лишь одно использование для использования двоичных файлов, но основная причина для этого - скорость.

Чтобы прочитать данные назад, вам необходимо знать формат, в котором вы его сохранили, например, в качестве простого примера, если я сохранил целое число, массив символов n размера и логическое значение, мне понадобится для чтения двоичного файла в виде целого числа, массива символов n размера и логического. В противном случае данные считываются неправильно и не будет очень полезен при всех

+1

Также я бы рассмотрел использование класса C++ fstream, поскольку он намного проще в использовании и сохраняет много головных болей. – user1294021

+0

Как fstream полезен, если вы используете C? –

+1

Он отметил его C, но есть тип строки, который делает его похожим на C++. – Scooter

1

Будьте осторожны. Тип поля «имя» в вашей структуре - «строка». Этот класс содержит данные, распределенные динамически. Поэтому запись «строковых» данных в файл таким образом будет вызвана только указателями, а не самими данными.

+0

Правильно, если это строковый класс C++, который вы используете, вам нужно будет использовать string.c_str() для извлечения строки символов и использовать string.size() * sizeof (char) для размера строки. – user1294021

+0

Тогда как я должен записывать данные 'name' в файл? 'fwrite (name.c_str(), name.size(), 1, fp)'? \ – Alcott

+0

В этом случае вам также придется записывать длину строки в файл. Вместо этого вы не можете прочитать его правильно. Или вы можете написать '\ 0' до конца строки. –

0

C++ Middleware Writer поддерживает двоичную сериализацию в/из файлов.

С точки зрения сортировки член «неподписанного возраста» вашей структуры является потенциальной проблемой. Я бы подумал об изменении типа на uint32_t.

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