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

时间:2017-04-11 04:17:53

标签: c++ c++11 visual-c++

大家好,

我有一个如下所示的文件(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;
}

2 个答案:

答案 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), &current) == 0 ) {
    data_records.push_back(current); 
}

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

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