Конвертировать fwrite в код типа C ++ для записи двоичных файлов - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь преобразовать IO файла стиля C в IO файла стиля C ++. Мне нужно написать число 42 в виде 4-байтового целого числа со знаком.

Вот пример того, какой IO типа C, который я пробовал, сработал

#include <stdio.h>
#include <string>
#include <fstream>

using namespace std;

int main()
{
  FILE *myFile;
  myFile = fopen ("input_file.dat", "wb");

  int magicn = 42;
  fwrite (&magicn, sizeof(magicn), 1, myFile);

  fclose (myFile);
  return 0;
}

Я пытаюсь преобразовать вышеуказанный код в IO типа C ++ на основе предложения из другого вопроса, который я задал( Как записать строку с заполнением в двоичный файл, используя fwrite? ).

Вот моя попытка:

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

int main()
{
  ofstream myFile ("input_file.dat", ios::binary);
  int magicn = 42;
  myFile << setw(sizeof(magicn)) << magicn;
  myFile.close();
  return 0;
}

Однако вывод, который я ожидаю, когда яиспользуйте команду 'xxd -b input_file.dat' не то же самое.

Ожидаемый вывод (сгенерированный с помощью кода ввода-вывода типа C)

0000000: 00101010 00000000 00000000 00000000 *. ..

Но я вижу (сгенерированный с моей попыткой ввода-вывода типа C ++)

0000000: 00100000 00100000 00110100 00110010 42

В поисках решения. Ценю помощь!

Ответы [ 2 ]

2 голосов
/ 27 октября 2019

Ваш текущий подход больше похож на fprintf(myFile, "%d", magicn). Таким образом, он выполняет вставку в поток в формате , поэтому вы получите код ASCII для 42-го символа ASCII.

Аналог fwrite - ostream::write. Просто посмотрите на доступных членов ostream, чтобы узнать, что вы можете с ним сделать.

1 голос
/ 27 октября 2019

Использование ostream::write.

myFile.write(reinterpret_cast<char*>(&magicn), sizeof(magicn));
...