大家好,
我有一个如下所示的文件(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(&amp; 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;
}
答案 0 :(得分:0)
我会使用这种类型的界面:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
Builder.load_string("""
<rootwid>:
canvas.before:
Color:
rgba: [1,1,1,1]
Rectangle:
pos: self.pos
size: self.size
Label:
text:'Palim'""")
class rootwid(BoxLayout):
pass
class Testapp(App):
def build(self):
return rootwid()
Testapp().run()
读/写是否为二进制,取决于实现。阅读和写作总是连续进行。可以读取特定记录,在这种情况下,必须在读取记录之前完成流指针操作。我已经添加了在流中寻找特定位置(无论是读取还是写入)的可能性,使用Record接口进行读/写。
答案 1 :(得分:0)
首先以你问的方式回答问题:要将所有数据读入向量,我建议更改代码,假设第一条记录的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提出的,有关详细信息,请参阅here)。