0

我正在重用一些旧代码(最初是在 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 调用:

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

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

任何建议都非常感谢。

4

3 回答 3

2

感谢您的帮助,根据 Agent_L 的建议,这是我想出的:

文本资源类型:

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

基于 fread 重读:

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 完成 reseek:

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 的任何调用以使用资源而不是外部文件。

于 2012-04-23T06:01:26.647 回答
1

The file handle contains not only the data but also it's length and current position. You have to duplicate that. (handwirtten code, unproven):

struct resFile
{
    char* pData;
    int iLenght;
    int iCurrPosition;
};

size_t resread( void* buffer, size_t size, size_t count, resFile* resource)
{
    int ActualRead = min(size*count, resource->iLenght - resource->iCurrPosition);
    memcpy(buffer, resource->pData + resource->iCurrPosition, ActualRead);
    resource->iCurrPostion += ActualRead;
    return ActualRead;
}
于 2012-04-18T12:51:56.990 回答
0

让我通知您fread移动当前文件位置。这意味着您不需要fseek每次都调用。从这个角度来看,您的代码可以resseek通过简单的增加Buffer指针来避免实现

于 2012-04-18T13:14:07.150 回答