【问题标题】:Read File by ULONG at a time一次读取 ULONG 的文件
【发布时间】:2018-12-26 13:43:15
【问题描述】:

我正在尝试适应一些代码,这些代码会在某些数据的头部创建一个 char *。然后能够一次递增该指针 unsigned long 以读取数据。

有人告诉我这样做的好方法是使用 ifstream 将文件(位于 C:/ 上的某处)读入向量:

std::vector<int8_t>

但我的困惑是如何将文件的每个部分拉出 ULONG 大小。我在下面发布了逻辑,这是与需要数据处于该大小的硬件进行通信,因此它们一次遍历 sizeOf(ULONG) 处的指针,直到它们读取文件的末尾(他们通过检查文件知道尺寸)。我知道我需要以某种方式将其加载到内存中.. 但是我如何以相同的方式遍历

他们的一小段代码如下所示:

char* resData;
res = FindResource(NULL, MAKEINTRESOURCE(fpgaDevice), L"FPGADATA");
  resHandle = LoadResource(NULL, res);
  resData = (char*)LockResource(resHandle);

然后为了推进文件,他们将指针推进了 ULONG 的大小:

resData += sizeof(ULONG);

要读取指针,只需使用:

(ULONG*)resData

【问题讨论】:

  • 他们使用的是内存映射文件吗? en.wikipedia.org/wiki/Memory-mapped_file
  • 永远不要同时使用c++c .....
  • int8_t 可能不够大,因为ULONG 可能是uint32_t
  • 你有问题。您标记了 C 语言,但 C 语言没有 std::vector。我建议您在混合或组合两种语言之前专注于一种语言。另外,更新您的语言标签。
  • 读取数据到 int8_t 向量并使用指向向量缓冲区的指针读取 uint32_t 数据块的意义何在.... 为什么不直接将数据读取到向量uint32_t 并通过索引访问值?

标签: c++ c file winapi


【解决方案1】:

你没有理由读入向量。您的资源已经加载到内存中,因此一致的方法是将memcpy 相关部分直接放入您的变量中。这里可能是:

...
char* resData = (char*)LockResource(resHandle);
...
ULONG myVar;
int offset = ...;    // the offset in the resource where your long value resides
memcpy(&myVar, resData+offset, sizeof(myVar));

这就是您现在可以使用的所有 ULONG 变量...


如果您不再拥有资源而是文件,则可以在 ifstream 上使用未格式化的 io 方法:

std::ifstream in(file_name, std::ios_base::in | std::ios_base_binary);
...
ULONG myVar;
int offset = ...;    // the offset in the resource where your long value resides
in.seekg(offset, std::ios_base::seekdir::beg);        // position the stream at the offset
in.read(static_cast<char *>(&myVar), sizeof(myVar));  // and read the bytes

【讨论】:

  • 嗯,那是旧代码。我现在只有文件的路径..所以不确定它现在是否已锁定到内存?在他们将 bin 文件加载到 .exe 本身之前
  • 好吧,我明白你的意思了。虽然我不认为我会有一个节日,因为我会在文件的顶部。我也正在尝试使用指针来执行此操作,在这种情况下我将不得不继续调用读取函数?
  • 您还需要SizeofResource(NULL, resHandle) 才能找到数据大小
【解决方案2】:

我假设您的数据是正确本机格式的二进制数据(我认为您的问题暗示了这一点)。

因此,如果您的数据是 ULONG,请不要使用 char 指针,请使用 ULONG 指针,如下所示

vector<int8_t> res;
// some code to read into res

// get the underlying data
ULONG* resData = (ULONG*)res.data();

// read a ULONG
ULONG someData = *resData;

// advance to the next ULONG
++resData;

重要的部分是使用data() 方法来访问向量数据。

【讨论】:

  • 这更有意义。我没有意识到你可以从向量中投射出这样的指针
  • 请注意,四个 int8_t 值可能无法满足作为单个 ULONG 访问的对齐要求。您需要将指针声明为未对齐以避免在对齐敏感的 CPU 上崩溃。
猜你喜欢
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2015-12-11
  • 2012-10-13
相关资源
最近更新 更多