使用struct中的struct读/写二进制文件

时间:2018-02-14 22:39:05

标签: file c++11 struct binary binaryfiles

我需要创建一个二进制文件并写入所创建的结构的当前状态。

这个结构有另一个结构。 像这样:

struct A {
    bool flag=true;
    int n;
};

struct B
{
    int n1;
    A *array;
};

如何在二进制文件中写入所有内容?

但特别是如何从二进制文件中读取并再次加载struct B中的所有内容,然后在A *array中加载所有内容。

非常感谢。

我试过这种方式,但有时会给我一个例外并阻止所有 (违反读取权限)。

如何写:

ofstream save("binary.bin", ios::binary);
    if (!save) {
        cerr << "Error creation file ";
    }
    else {
        save.write(reinterpret_cast<char*>(&prova), sizeof(prova));
    }

    binary.close();

如何阅读和打印:

save.read(reinterpret_cast<char*>(&prova), sizeof(prova));
for (size_t i = 0; i != try.n1; ++i)
   {
   cout << "....." << try.n1 <<endl;
   cout << "..... "<< try.array[i].n <<" ";
   cout << ".....: "<<try.array[i].flag<< endl;
  }

1 个答案:

答案 0 :(得分:1)

在二进制文件中写入A的单个实例很简单,因为它是一个POD类型:

std::ofstream outfile = {...};
A a = { ... };
outfile.write(reinterpret_cast<char const*>(&a), sizeof(a));

写一个B,OTOH的单个实例并不那么简单。您必须首先编写n1,然后编写数组中的元素。

B b = { ... };

// Write the number of elements first.
outfile.write(reinterpret_cast<char const*>(&b.n1), sizeof(b.n1));

// Now write the elements.
outfile.write(reinterpret_cast<char const*>(b.array), sizeof(A)*b.n1);

从二进制文件中读取显然是相反的。读取A的实例很简单。

std:ifstream infile = { ... };

A a;
infile.read(retinterpret_cast<char*>(&a), sizeof(a));

阅读B的实例更为复杂。您必须首先读取大小,然后为数组元素分配内存,然后读取数组的元素。

B b;

// Read the number of elements
infile.read(retinterpret_cast<char*>(&b.n1), sizeof(b.n1));

// Allocate memory for the elements of the array.
b.array = new A[b.n1];

// Now read the elements of the array.
infile.read(retinterpret_cast<char*>(b.array), sizeof(A)*b.n1);

您可以使用辅助函数简化部分代码,从而减少代码中retinterpret_cast的使用。

namespace MyApp
{
   template <typename T>
   std::ostream& write(std::ostream& out, T const& pod)
   {
      out.write(reinterpret_cast<char const*>(&pod), sizeof(T));
      return out;
   }

   template <typename T>
   std::ostream& write(std::ostream& out, T* array, int numElements)
   {
      out.write(reinterpret_cast<char const*>(array), sizeof(T)*numElements);
      return out;
   }

   template <typename T>
   std:istream read(std::istream& in, T& pod)
   {
      in.read(reinterpret_cast<char*>(&pod), sizeof(T));
      return in;
   }

   template <typename T>
   std:istream& read(std:istream& in, T* array, int numElements)
   {
      in.read(reinterpret_cast<char*>(array), sizeof(T)*numElements);
      return in;
   }
}

现在,您可以使用:

// Write a
MyApp::write(outfile, a);

// Read a
MyApp::read(infile, a);

// Write b
MyApp::write(outfile, b.n1);
MyApp::write(outfile, b.array, b.n1);

// Read b
MyApp::write(infile, b.n1);
b.array = new A[b.n1];
MyApp::write(infile, b.array, b.n1);