[英]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), ¤t) == 0 ) {
data_records.push_back(current);
}
现在考虑到你按顺序读取所有记录,你实际上可以忘记RecordNumber
和对SetFilePointer
的调用,因为文件读取位置应该由ReadFile
调用更新。
在任何情况下,为了更好的代码可移植性,最好使用C ++标准库中的文件IO函数而不是MS Windows特定的调用(如WernerErasmus提出的,详情请参见此处 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.