BinaryWriter и BinaryReader в C ++ - PullRequest
       0

BinaryWriter и BinaryReader в C ++

1 голос
/ 19 ноября 2010

Я работаю в C ++ в Linux. Мне интересно, есть ли BinaryReader и BinaryWriter эквивалентности C # в Linux?

Спасибо.

Ответы [ 8 ]

3 голосов
/ 19 ноября 2010

Что ж, если вы хотите работать с двоичными файлами, вы можете использовать простой C API (fopen / fread / fwrite / fclose) или искать библиотеки C ++: iostream и fstream

3 голосов
/ 19 ноября 2010

Самое близкое, что вы можете получить, это классы ofstream и ifstream:

// Write an integer, a double and a string to a binary file using ofstream
std::ofstream out("out.data", std::ios_base::out | std::ios_base::binary);
out << 10 << ' ' << 893.322 << ' ' << "hello, world" << std::endl;
out.close();

// Read an integer, a double and a string from a binary file using ifstream:
std::ifstream in("in.data", std::ios_base::in | std::ios_base::binary);
int i = 0;
double d = 0.0f;
std::string s;
in >> i;
in >> d;
in >> s; // reads up to a whitespace.

// or you can read the entire file in one shot:
std::stringstream buffer;
buffer << in.rdbuf();
s = buffer.str(); // the entire file contents as an array of bytes.

in.close();
2 голосов
/ 19 ноября 2010

Есть библиотеки iostream .

1 голос
/ 19 ноября 2010

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

Как то так -

#include <fstream>
int main()
{
   std::ofstream out("out.data", std::ios_base::out | std::ios_base::binary); 

   int a = 120;
   out.write(reinterpret_cast<const char*>(&a), sizeof(int));
   out.close(); 
}
1 голос
/ 19 ноября 2010

Проверка использования стандартных классов iostream и fstream.Использование C API очень жаль, но все же возможно.

0 голосов
/ 19 ноября 2010

вам нужна только одна библиотека: boost::serialization

0 голосов
/ 19 ноября 2010

В отличие от C #, где строки представляют собой последовательности двухбайтовых «слов» и кодируются как UTF-16. Строки C ++ (std :: string) являются байтовыми последовательностями, и они обычно кодируются UTF-8 или другими локальными кодировками в зависимости от вашей системы.

Таким образом, преобразование набора символов не выполняется, когда вы записываете строку в «поток байтов», поэтому обычные файловые потоки, такие как std :: fstream, или потоки в памяти, такие как std :: stringstreadm, все получены из std :: ostream и / или std :: istream и фактически являются потоками байтов, которые вы ищете.

0 голосов
/ 19 ноября 2010

Быстрый ответ: нет.

В ответ на другие ответы: Стандартная библиотека шаблонов предоставляет классы для потоковой передачи данных, но не предоставляет никаких высокоуровневых функций для преобразования данных в сериализованный двоичный формат иназад снова.

Операторы << и >> могут работать для классов, для которых явно написан код, поддерживающий их.Но это не близко к тому, что могут делать BinaryWriter и BinaryReader, а именно к потоковой передаче целых графов объектов с учетом циклических ссылок. В .NET все, что требуется, - это чтобы каждый из классов имел атрибут [Serializable]применяется к ним.

Если вы думаете о различиях между C ++ и C #, вы можете понять, почему не предоставляется полный двоичный форматировщик.Я могу подумать о следующих проблемах:

  • C ++ не имеет возможности отражения C #.
  • Поскольку C ++ не имеет управляемой памяти, было бы невозможно выполнить потоковую передачу графа объекта, принимаяна счет циркулярных ссылок.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...