gpt4 book ai didi

c++ - 资源而不是外部文件 C++

转载 作者:行者123 更新时间:2023-11-28 00:57:42 28 4
gpt4 key购买 nike

我正在重用一些旧代码(最初是在 c 上开发的,而不是 c++)和一些函数来打开/读取/操作文本文件。文本文件的路径作为字符串 (char*) 传递给函数,然后使用以下命令打开:FileToUse = fopen(filename, "rb"); 然后多次调用 fread( )fseek() 被使用。已知此代码适用于外部文本文件,但现在我想将文本文件作为资源包含在我的项目中(visual studio 中的 MFC C++)。

我在网络上找到了一些关于如何使用资源的例子,导致了这段代码:

HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hResource = FindResource(hInst, MAKEINTRESOURCE(IDR_TEXTFILE1), "TEXTFILE");

if (hResource){
HGLOBAL hLoadedResource = LoadResource(hInst, hResource);
if (hLoadedResource){
const char* pResource = LockResource(hLoadedResource);
if (pResource){
DWORD dwResourceSize = SizeofResource(hInst, hResource);
if (0 != dwResourceSize){ // if(FileToUse){
memcpy(&Buffer, pResource, (15 * 2)); // fread($Buffer, 15, 2, FileToUse);
pTemp = pResource + 200; // fseek(FileToUse, 200, SEEK_SET);
pTemp = pTemp + 100; // fseek(FileToUse, 100, SEEK_CUR);
pTemp = pResource + (dwResourceSize - 1) - 40; // fseek(FileToUse, -40, SEEK_END);
}
}
}
}

如图所示,我用 memcpy() 替换了 fread 调用,但是我缺少 fread 的返回值(实际读取的项目)并且在原始代码中文件指针被 fseek 移动,我想知道我的方法是否使用临时指针是正确的。

我的最终目标是模拟 fread 和 fseek 对具有类似函数原型(prototype)的资源的调用:

size_t resread(void* buffer, size_t size, size_t count, char* resource );

int resseek( char* resource, long offset, int origin );

非常感谢任何建议。

最佳答案

感谢您的帮助,根据 Agent_L 的建议,我得出了以下结论:

文本资源类型:

struct _resource {
const char * content; // File content
size_t size; // File size
size_t ptrloc; // 'Pointer' location
};
typedef struct _resource RES_TXT;

基于恐惧重读:

size_t resread( void* buffer, size_t size, size_t count, RES_TXT * resource)
{
size_t actualCount = ( resource->size - resource->ptrloc ) / size;
actualCount = min( count, actualCount );
if ( actualCount <= 0 ) return 0;
memcpy(buffer, (resource->_ptr + resource->ptrloc), (actualCount * size) );
resource->ptrloc += (actualCount * size);
return actualCount;
}

并根据fseek完成resseek:

int resseek( RES_TXT * resource, long offset, int origin ) {
size_t nextloc;
switch ( origin ) {
case SEEK_SET: nextloc = 0;
break;
case SEEK_CUR: nextloc = resource->ptrloc;
break;
case SEEK_END: nextloc = resource->size;
break;
default: return -1;
}
nextloc += offset;
if ( nextloc >= 0 && nextloc < resource->size )
resource->ptrloc = nextloc;
else
return -1;
return 0;
}

现在可以将对 fseek 和 fread 的任何调用替换为使用资源而不是外部文件。

关于c++ - 资源而不是外部文件 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10209233/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com