如何在结构体中使用字符串而不是字符数组来读取二进制数据

How do I use a string in a struct instead of a char array for reading binary data

本文关键字:数组 字符 读取 数据 二进制 结构体 字符串      更新时间:2023-10-16

我正在将二进制数据读取到一个结构体中,它工作得很好。下面是代码:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct TaqIdx {
  char symbol[10];
  int tdate;
  int begrec;
  int endrec;
}__attribute__((packed));
int main()
{
  ifstream fin("T201010A.IDX", ios::in | ios::binary);
  if(!fin) {
    cout << "Cannot open file."  << endl;
    return 1;
  }
  int cnt = 0;
  TaqIdx idx;
  while(fin.read((char *) &idx,sizeof(idx))) {
    if(!fin.good()) {
      cout << "A file error occurred." << endl;
      return 1;
    }
    idx.symbol[10] = '';
    cout << "(" << idx.symbol << ", " << idx.tdate << ", " 
         << idx.begrec << ", " << idx.endrec << ") "
         << cnt++ << endl;
  }
  fin.close();
  return 0;
}

前几行输出如下:

(A         , 20100864, 1, 35981) 0
(AA        , 20100864, 35982, 89091) 1
(AAPR      , 20100864, 89092, 89093) 2
(AACC      , 20100864, 89094, 89293) 3
(AADR      , 20100864, 89294, 89301) 4
(AAI       , 20100864, 89302, 99242) 5
(AAME      , 20100864, 99243, 99252) 6
(AAN       , 20100864, 99253, 102275) 7
(AANA      , 20100864, 102276, 102280) 8
(AAON      , 20100864, 102281, 102592) 9

我的问题是:是否有可能用c++字符串代替结构中的C风格字符数组?如果有,你能举个例子说明我该怎么做吗?很多谢谢!

代码似乎被设计为将用特定二进制格式序列化的数据读取为TaqIdx格式。当然可以修改读取器以提供不同格式的数据(包括std::string),但是必须重写读取器或在加载后进行转换。或者,您可以为数据使用完全不同的格式,但这可能与您拥有的文件不兼容。

我还不能"到处注释",所以我很抱歉这有点超出了这些部分的标准协议。为什么这个不断裂?

idx.symbol[10] = '';

symbol的长度是10,__attribute__((packed))不会在tdate的第一个字节上放一个空字节吗?