Как написать строку с отступом в двоичный файл, используя fwrite? - PullRequest
0 голосов
/ 06 октября 2019

Мое требование - записать 32-байтовую строку, указывающую единицы измерения давления, в двоичный файл. Единицами давления, которые я хочу написать, является «Па» в виде 32-байтовой строки. И вот моя попытка.

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

using namespace std;

int main()
{
  FILE *myFile;
  myFile = fopen ("input_file.dat", "wb");
  //Units
  string units = "Pa";
  //Write Units
  fwrite (&units, 1, 32, myFile);
  fclose (myFile);
  return 0;
}

Я ожидаю (преобразование Pa в бинарный в 32 байта). «00100000» - это пробелы. Как добавить те просто Pa

1005 * 01010000 01100001 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000 00100000

Однако я вижу

Output when I compile and run the above code

Ответы [ 2 ]

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

Строка "Pa" составляет всего 2 байта (3, если вы считаете нулевой терминатор), но вы хотите записать 32 байта в ваш файл. Таким образом, вам нужно дополнить строку 30 пробелами. Есть много разных способов справиться с этим:

char units[32] = "Pa";
memset(units+2, ' ', 30);
fwrite (units, 1, 32, myFile);
std::string units = "Pa";
std::string padding(32-units.size(), ' ');
fwrite (units.c_str(), 1, units.size(), myFile);
fwrite (padding.c_str(), 1, padding.size(), myFile);
std::string units = "Pa";
std::ostringstream oss;
oss << std::setw(32) << std::setfill(' ') << std::left << units;
std::string s = oss.str();
fwrite (s.c_str(), 1, s.size(), myFile);

При этом, поскольку вы используете C ++, вы должны использовать файловый ввод / вывод в стиле C ++ вместо файла в стиле CВвод / вывод, например:

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;

int main() {
    ofstream myFile ("input_file.dat", ios::binary);
    string units = "Pa";
    myFile << setw(32) << setfill(' ') << left << units;
    return 0;
}
0 голосов
/ 06 октября 2019

Вы не можете записать строку непосредственно в файл, вы записываете содержимое класса string в свой файл, это, вероятно, что-то вроде указателя и размера, а не символьных данных.

Простое исправление состоит в том, чтобы внести следующее изменение, чтобы записать символьные данные (включая нулевой терминатор, если вы не хотите удалять +1):

fwrite (units.c_str(), 1, units.size() + 1, myFile);

Другая альтернативаиспользовать потоки c ++, которые могут записать строку напрямую:

#include <fstream>
#include <string>

int main()
{
  std::ofstream myFile("input_file.dat", std::ios_base::binary);
  //Units
  string units = "Pa";
  //Write Units
  myFile << units;
  return 0;
}
...