如何正确地将数据从二进制文件读取到char数组

时间:2017-05-08 19:35:56

标签: c++

如何正确地将数据从二进制文件写入新的char数组。 我知道这个问题在这里被多次询问过,但我仍然无法弄清楚如何正确地做到这一点。

这就是我到目前为止......

struct Computer_Details {

      char computer_type[99];
      int release_year;
      float price;

    };


    Computer_Details pc_details;

      cout << "Enter Computer Type: ";
      cin.getline(pc_details.computer_type, 255);
      cout << "Enter Computer Release Date: ";
      cin >> pc_details.release_year;
      cout << "Enter Computer Price: ";
      cin >> pc_details.price;
      cout << "\n\n";

      //Create File
      ofstream file;
      file.open("PC_Database.data", ios::binary | ios::app);

      if (!file) cout << "Couldn't open file\n";
      else {
        file.write((char*)&pc_details, sizeof(Computer_Details));
        file.close();
      }


      ifstream readFile;
      readFile.open("PC_Database.data", ios::binary);
      if (!readFile) cout << "Couldn't Open File\n";
      else {
        readFile.seekg(0, ios::end);
        int fileSize = readFile.tellg();
        int pcCount = fileSize / sizeof(Computer_Details);

        readFile.seekg(0, ios::beg);
        Computer_Details *pc_details = new Computer_Details[pcCount];
        readFile.read((char*)pc_details, pcCount * sizeof(Computer_Details));

        char *buff = new char[299];

        for (int i = 0; i < pcCount; i++)
        {
          //write to buff char
        }
        readFile.close();
    }

3 个答案:

答案 0 :(得分:0)

尝试

std::ifstream input(szFileName, std::ios::binary);
data = std::vector<char>(std::istreambuf_iterator<char>(input),
    (std::istreambuf_iterator<char>()));
char* charArray = &data[0];
size_t arraySize = data.size();

data向量的缓冲区是所需的char数组。它的构造函数的参数是两个迭代器。第一个是ifstream中的当前阅读位置(在这种情况下是流的开始)。第二个构造函数是默认值,它被视为结束迭代器。

答案 1 :(得分:0)

可能问题是你的结构大小, 检查结构的大小并将其与此结构的大小进行比较:

struct Computer_Details {
      char computer_type[100];
      int release_year;
      float price;
    };

同样的问题是当您尝试读取/写入包含两个其他类型(如int)之间的bool变量的结构时。

试试这个:

readFile.read((char*)pc_details->computer_type, sizeof(Computer_Details::computer_type));
readFile.read((char*)pc_details->release_year, sizeof(Computer_Details::release_year));
readFile.read((char*)pc_details->price, sizeof(Computer_Details::price));

编辑:查看此评论中的示例:https://stackoverflow.com/a/119128/7981164

答案 2 :(得分:0)

我的猜测是你想将pc_details推送到buff中,这样你就可以将它发送到某个地方并重建数据。

如果是这种情况,你可以这样做:

for( int i=0; i < pcCount; i++ )
{
    memcpy( buff, (char*)pc_details, sizeof(computer_details));
    buff += sizeof(computer_details);
    pc_details++;
}

然而,在这样做时,你必须注意对齐并提供 因此填充。你的代码应该检查你的数组边界。