【发布时间】:2017-09-06 07:04:51
【问题描述】:
大家好,
我有一个如下所示的文件(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;
}
【问题讨论】:
-
您必须跟踪已阅读的条目数。可能二进制文件中的每个条目都具有相同的大小(如果不是,则此函数将不起作用,因为它假定每个元素的大小相同),因此提供
RecordNumber允许偏移量计算在何处查找此特定条目。 -
google protobuf 可能是您的解决方案。
-
是的,二进制文件中的每个条目都有相同的大小。如何跟踪条目数以及如何计算偏移量?能否请您让我理解清楚。
-
@RevanthRao 据我所知,您的函数读取编号为
RecordNumber的记录并正确执行所有计算。为了节省开支,您可能会考虑编写一个小测试程序来检查代码是否符合您的要求。 @Rogus 偏移量是从文件的开头计算和设置的,那么他为什么要跟踪已经读取的记录数呢? -
@GertWollny 是的,函数读取编号为 RecordNumber 的记录。我应该传递什么作为记录号?
标签: c++ c++11 visual-c++