Какой самый простой способ записать 4 массива в файл многоплатформенным способом? - PullRequest
0 голосов
/ 21 сентября 2010

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

Должно ли быть несколько файлов для каждого массива?

Ответы [ 6 ]

1 голос
/ 21 сентября 2010

Если у вас нет огромного количества данных, просто напишите стандартный текстовый формат.Если вы можете использовать c99 на обоих концах, используйте форматер %a для данных с плавающей запятой, чтобы изолировать себя от капризов двоично-десятичного преобразования.

Если объем данных огромен или вам необходимоиспользуйте формат «необработанных данных» по другим причинам; перед записью вы захотите преобразовать ваши данные в известный порядок байтов, а после чтения - обратно в порядок байтов хоста.Любая разумная ОС имеет библиотечные процедуры для выполнения этих преобразований.

1 голос
/ 21 сентября 2010

Пишите в виде обычного текста ... и затем архивируйте его

Presto! двоичный формат

0 голосов
/ 21 сентября 2010

Если вы используете прагма-пакет (1), вы можете выполнять запись / чтение одним ударом по фрагменту памяти.

#include <stdio.h>  
#include <memory.h>  
typedef struct ca_tag{  
int i[4];  
float f[3];  
}ca_type;  

#pragma pack(1)  
void init(ca_type* c)  // fill it with something
{  
   c->i[0] = 1; c->i[1] = 2; c->i[2] = 3; c->i[3] = 12;  
   c->f[0] = 2.3; c->f[1] = 32.3; c->f[2] = 42.3;  
}  
int main()  
{  
   FILE *stream;  
   ca_type ca;  
   char *ptr = (char*)&ca;  
   char *ptr2 = (char*)&ca;  
   init(&ca);  
   if( (stream = fopen( "test.out", "wb" )) != NULL )  
      fwrite( ptr, sizeof( ca ), 1, stream );  
   else  
      printf( "Problem opening for write\n" );  
   fclose(stream);  
   memset((void *)&ca, 0, sizeof(ca));// zero the lot  
   if( (stream = fopen( "test.out", "rb" )) != NULL )  
     fread( (void*)ptr2, sizeof( ca ), 1, stream );  
   else  
      printf( "Problem opening for read\n" );  
   return 0;  
}  

Проверка ошибок должна выполняться как прежде

0 голосов
/ 21 сентября 2010

Если вы просто ищете пример, ниже приведен чрезвычайно простой пример без проверки ошибок. Он записывает содержимое структуры с некоторыми целыми числами в файл и затем снова считывает их обратно. Тем не менее, замечания других относительно порядка следования байтов очень уместны, и их необходимо учитывать, если файл будет использоваться на разных платформах.

typedef struct {
   int count;
   int *values;
} SomeInts;


int main(int argc, char* argv[])
{
   SomeInts ints;
   int i;
   FILE *fh;

   ints.count = 5;
   ints.values = (int*)malloc( ints.count * sizeof(int));
   for ( i = 0; i < ints.count; i++ )
      ints.values[i] = i * 42;

   // write it
   fh = fopen( argv[1], "wb" );
   // really should check amount written to verify it worked
   fwrite( &ints.count, sizeof( ints.count ), 1, fh );
   fwrite( ints.values, sizeof(ints.values[0]), ints.count, fh );
   fclose(fh);

   // read them back in.
   free( ints.values );
   memset( &ints, 0, sizeof( ints ));


   fh = fopen( argv[1], "rb" );
   // read how many ints (should also check for errors)
   fread( &ints.count, sizeof( ints.count ), 1, fh );
   ints.values = (int*)malloc( ints.count * sizeof(int));
   fread( ints.values, sizeof(ints.values[0]), ints.count, fh );
   fclose(fh);

   for ( i = 0; i < ints.count; i++ )
      printf( "%d\n", ints.values[i] );

   free( ints.values );

}
0 голосов
/ 21 сентября 2010

man fwrite / fread .

Однако, Endianness может быть проблемой, если вы используете какую-то странную платформу. Также вам следует использовать типы с фиксированным размером на всех платформах.

0 голосов
/ 21 сентября 2010

Я немного заржавел в C, но, вероятно, кто-то написал поддержку для сериализации массивов в двоичные данные специально для записи и / или чтения из файла.Сериализация Google для вашего конкретного языка, и, вероятно, кто-то уже решил эту проблему для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...