C ++读取/写入二进制文件的长值

时间:2012-12-23 04:35:04

标签: c++ fstream

我正在尝试使用fstream读取和写入long数组到二进制文件。我将数组定义如下:

#define MAX_SUB_BUCKETS 27    
unsigned long origin[MAX_SUB_BUCKETS];
unsigned long nextAvail[MAX_SUB_BUCKETS];
fstream fh;

我打开文件并尝试以下操作:

fh.open(fileName.c_str(), fstream::in | fstream::out | fstream::binary);
if (fh.fail()) {
         // create new file here and write all zeroes to it (plus header)
} else {
          fh.seekg (0, ios::beg);
          for (i=0;i<MAX_SUB_BUCKETS;i++) {
                     fh.read(origin[i],sizeof(long));               
          }
          for (i=0;i<MAX_SUB_BUCKETS;i++) {
                     fh.read (nextAvail[i],sizeof(long));
          }
}

编译器抱怨以下错误:

tld.hh:39: error: invalid conversion from 'long unsigned int' to 'char*'
tld.hh:39: error:   initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]'
tld.hh:42: error: invalid conversion from 'long unsigned int' to 'char*'
tld.hh:42: error:   initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]'
tld.hh:45: error: invalid conversion from 'void*' to 'char*'
tld.hh:45: error:   initializing argument 1 of 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::read(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]'

第39行是第一个fh.read()调用。不知道我在这里做错了什么(除了我对这些事情基本缺乏了解)。我也确定可能有一种方法可以在单个语句而不是循环中读取整个origin或nextAvail数组。

2 个答案:

答案 0 :(得分:0)

从错误中,您似乎试图在read上操作的上使用unsigned long进行char。你可以尝试这样的事情:

fh.read( reinterpret_cast< char* >( &origin[i] ), sizeof( long ) );

答案 1 :(得分:0)

由于二进制文件是字节数组,因此您需要编写一些例程,将要存储在文件中的数据转换为某种特定格式的字节数组。要读回它们,您需要编写一个例程,从文件中读取一个字节数组,并将它们转换为您希望它们所处的任何形式。

本质上,您需要将序列化(结构化数据写入一堆字节)和反序列化(字节串到结构化数据)例程。您可能希望使用XML或JSON(甚至是原始文本)之类的格式,因为它们非常容易理解,并且可以广泛使用转换为这些格式的库。