2012-12-23 2 views
1

Я пытаюсь читать и записывать массив longs в двоичный файл, используя fstream. Я массивы определяются следующим образом:C++ Чтение/запись длинных значений в двоичный файл

#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(). Не уверен, что я делаю неправильно здесь (за исключением моего основного недостатка знаний об этих вещах). Я также уверен, что есть, вероятно, способ прочитать весь массив происхождения или nextAvail в одном выражении, а не в цикле.

+0

Объявление 'fh', или, по крайней мере, его тип, было бы здесь важно ... –

+1

Если у вас есть даже самые отдаленные прихоти, сделавшие это достаточно переносимым, рассмотрите использование' htonl() 'и' ntohl() ' как только вы получите это в квадрате, кстати. – WhozCraig

ответ

0

От ошибки, это выглядит, как вы пытаетесь сделать read с unsigned long сек на потоке что operats на char с. Вы можете попробовать что-то вроде этого:

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

Это сделало трюк (по крайней мере, до устранения ошибок компилятора). Теперь посмотрим, смогу ли я заставить его работать. Благодарю. – mlewis54

0

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

По существу, вам необходимо написать сериализацию (структурированные данные на куча байтов) и десериализации (пучки байтов в структурированные данные). Возможно, вы захотите использовать формат XML или JSON (или даже сырой текст), потому что их очень легко понять, а библиотеки для преобразования в эти форматы и из них широко доступны.

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