2013-05-06 2 views
0

Я сериализация некоторых данных в файл, как это:C++ определения размера данных перед записью в файл

vector<ByteFeature>::iterator it = nByteFeatures.Content().begin(); 
for (;it != nByteFeatures.Content().end(); ++it) 
{ 
    for (int i = 0; i < 52; i++) 
    { 
     fwrite(&it->Features[i], sizeof(unsigned char), 1, outfile); 
    } 
} 

Но я хотел бы знать заранее, сколько байт, которые будут находиться в файле. Я хотел бы написать этот номер перед фактическими данными. Потому что в некоторых ситуациях мне придется пропустить загрузку этих данных, и мне нужно знать, сколько байтов мне нужно пропустить.

На диск записано больше данных, и для меня было бы очень важно, чтобы я мог записать количество байтов непосредственно перед фактическими данными. Я не хочу хранить это число в отдельном файле или так.

.Content.size() would only tell me how many "items" are in there, but not the actual size of the data. 

спасибо.

+2

Поскольку вы пишете 52 байта для каждого элемента, будет ли 'nByteFeatures.Content(). Size() * 52' не делать трюк? –

+1

Почему бы не использовать 'sizeof()' в вашем типе данных, а затем умножить на '.Content.size()'? (т. е. 'sizeof (ByteFeature) * nByteFeatures.Content(). size()') – JBL

+0

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

ответ

4

Я должен был сделать это перед собой.

Подход, который я принял, состоял в том, чтобы написать 4-байтовый заполнитель, затем данные, а затем fseek() вернуться к заполнителю, чтобы написать длину.

  • Напишите 4-байтовый заполнитель для файла.
  • ftell(), чтобы получить текущую позицию файла.
  • Запишите данные в файл.
  • ftell(), чтобы получить новую позицию.
  • Вычислить длину: разницу между двумя значениями ftell().
  • Затем fseek() вернитесь к заполнителю и напишите длину.
+0

Хм, 4 байта кажется немного маленьким. Я полагаю, что это связано с приложением. Например, запись размера файла обычно используется в формате файла NITF (он использует 12 байтов), но размер файла не в начале. Это часть формата в заголовке файла. Предположительно, можно было только открыть часть файла, чтобы в конечном итоге получить размер файла. Не уверен, сколько времени вы спасете, просто положив его на фронт, как хочет OP. – 2013-05-06 13:57:56

+0

Размер будет соответствовать «int». Можете ли вы добавить код для «записи длины»? Это было бы прекрасно! – tmighty

+0

@ Andy Thomas-Cramer Размер будет соответствовать «int». Не могли бы вы добавить код? Это было бы прекрасно! Я просто так боюсь что-то испортить, и я провел день с отслеживанием ошибки. Это было бы очень хорошо. – tmighty

2

Вы пишете 52 unsigned char s в файл за каждые ByteFeature. Таким образом, общее количество байтов, которые вы пишете, равно 52 * nByteFeatures.Contents().size(), при условии, что один символ равен одному байту.

+0

'sizeof (unsigned char)' гарантированно будет 1. 'sizeof' выражает размер в количестве объектов' char'. – Angew

+0

Вы правы ... Отредактировано. – rwols

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