以多平台方式将4个数组写入文件的最简单方法是什么?

时间:2010-09-21 15:03:34

标签: c file-io file

假设我们有一个int数组的结构,一个float数组等,我们需要将它们写入二进制格式文件以便快速重新加载。这可以用一种简单的方式完成吗?

每个阵列的文件应该是几个吗?

6 个答案:

答案 0 :(得分:1)

用纯文本写...然后压缩

Presto!二进制格式

答案 1 :(得分:1)

除非您拥有大量数据,否则只需编写标准文本格式即可。如果你可以假设两端都是c99,那么使用%a格式化程序来获取浮点数据,使你自己免受二进制十进制转换的变幻莫测。

如果数据量很大,或者由于其他原因需要使用“原始数据”格式,则需要在写入之前将数据转换为已知的字节序,并在读取后转换回主机字节序。任何合理的操作系统都有用于执行这些转换的库例程。

答案 2 :(得分:0)

我在C中有点生疏,但很可能有人支持将数组序列化为二进制数据,专门用于写入和/或从文件读取。针对您的特定语言的Google序列化,可能有人已经为您解决了这个问题。

答案 3 :(得分:0)

man fwrite/fread

但是,Endianness可能是一个问题,如果你使用一些奇怪的平台。您也应该使用在所有平台上具有固定大小的类型。

答案 4 :(得分:0)

如果您只是在寻找一个例子,以下是一个非常简单的例子,绝对没有错误检查。它将带有一些整数的结构的内容写入文件,然后再将其读回。然而,其他人关于字节顺序的观点非常密切,如果要在不同的平台上使用该文件,则需要解决。

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 );

}

答案 5 :(得分:-1)

如果你使用pragma pack(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;  
}  

错误检查需要像以前一样进行