【问题标题】:How properly to read data from binary file to char array如何正确地将数据从二进制文件读取到 char 数组
【发布时间】:2017-05-08 19:35:55
【问题描述】:

如何正确地将二进制文件中的数据写入新的 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();
    }

【问题讨论】:

  • 你可以使用strcpy
  • 这个答案没有帮助
  • 离题:cin.getline(pc_details.computer_type, 255);char computer_type[99] 之间的长度不匹配,导致computer_type 超出范围。

标签: c++


【解决方案1】:

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

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】:

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

    如果是这样,你可以这样做:

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

    但是,在执行此操作时,您必须注意对齐并提供 相应地填充。你的代码应该检查你的数组边界。

    【讨论】:

      【解决方案3】:

      试试

      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 向量的缓冲区是需要的字符数组。它的构造函数的参数是两个迭代器。第一个是ifstream 中的当前读取位置(在这种情况下是流的开始)。第二个的构造函数是默认的,它被视为一个结束迭代器。

      【讨论】:

        猜你喜欢
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-20
        • 2016-02-29
        • 2020-11-24
        • 1970-01-01
        相关资源
        最近更新 更多