繁体   English   中英

如何在结构中存储二进制文件数据?

[英]How to store binary file data in structure?

大家好,

我有一个如下所示的文件(Material.dat),它是二进制文件,我想从文件中读取数据并放入我使用过GetRecord()函数的结构中。

HANDLE hFileMac = ::CreateFile(_T("Material.dat"), GENERIC_READ, FILE_SHARE_READ, NULL,
  OPEN_EXISTING, FALSE ? FILE_FLAG_SEQUENTIAL_SCAN : FILE_ATTRIBUTE_NORMAL, NULL);

 if (!(hFileMac != INVALID_HANDLE_VALUE))
 {
  return;
 }

 GetRecord(hFileMac, RECORD_NUMBER, sizeof(Header), reinterpret_cast<void *>(&Header));

我怀疑是什么作为记录号传递到Get Record()函数?

GetRecord(hFileMac,RECORD_NUMBER,sizeof(Header),reinterpret_cast(&Header));

int GetRecord(HANDLE hFile, int RecordNumber, int RecordSize, void *RecordPtr)
{
 if (RecordNumber <= 0 || RecordSize <= 0)
  return 1;
 LONG lOffset = (RecordNumber - 1) * RecordSize;

 if (SetFilePointer(hFile, lOffset, NULL, FILE_BEGIN) == 0xFFFFFFFF)
  return 2;

 DWORD dwSize;

 if (::ReadFile(hFile, RecordPtr, RecordSize, &dwSize, NULL) == 0)
  return 3;

 return 0;
}

我会使用这种类型的界面:

class Record {
  //Reads a single record from "from", incrementing the associated 
  // read pointer, and returning eof or bad, depending on whether record
  // state is consistent, and whether eof stream is reached
  std::istream& read(std::istream& from);
  //Writes a single record to "to"
  std::ostream& write(std::ostream& to);
}

struct MaterialStore {
  //Reads all records from "from", in sequence, using Record interface
  std::istream& read(std::istream& from);

  //Writes all records in "to" to, in sequence, using Record interface
  std::ostream& write(std::ostream& to);

  //Perhaps to perform that seeking for a specific record, the
  // Use Record interface for retrieval.
  std::iostream& seekRecord(std::iostream& stream, int index pos);

  const Record& getRecords(); //Returns all the records read
}

读/写是否为二进制,取决于实现。 阅读和写作总是连续进行。 可以读取特定记录,在这种情况下,必须在读取记录之前完成流指针操作。 我已经添加了在流中寻找特定位置(无论是读取还是写入)的可能性,使用Record接口进行读/写。

首先以你问的方式回答问题:要将所有数据读入向量,我建议更改代码,假设第一条记录的RecordNumber = 0:

LONG lOffset = RecordNumber * RecordSize;

然后,要将所有记录读入std :: vector,您可以执行类似的操作

struct Record {...}; 
typedef Record* RecordPtr; 
...
std::vector<Record> data_records; 
Record current; 

while (GetRecord(hFile, data_records.size(), sizeof(Record), &current) == 0 ) {
    data_records.push_back(current); 
}

现在考虑到你按顺序读取所有记录,你实际上可以忘记RecordNumber和对SetFilePointer的调用,因为文件读取位置应该由ReadFile调用更新。

在任何情况下,为了更好的代码可移植性,最好使用C ++标准库中的文件IO函数而不是MS Windows特定的调用(如WernerErasmus提出的,详情请参见此处 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM