0

テキストファイルを開く/読み取る/操作するためのいくつかの関数を備えた古いコード(元々はc ++ではなくcで開発された)を再利用しています。テキストファイルへのパスは、文字列(char *)として関数に渡され、次を使用して開かれます。FileToUse = fopen(filename, "rb");次に、への複数の呼び出しが使用さfread()fseek()ます。このコードは外部テキストファイルで機能することが知られていますが、プロジェクトのリソースとしてテキストファイルを含めたいと思います(VisualStudioのMFCC ++)。

このコードで乱暴なリソースを使用する方法について、Web上でいくつかの例を見つけました。

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);
      }
    }
  }
}

図のようにfread呼び出しをmemcpy()に置き換えましたが、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に基づいてreseeekを完了するには:

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

ファイルハンドルには、データだけでなく、データの長さと現在の位置も含まれています。あなたはそれを複製する必要があります。(手書きのコード、証明されていない):

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これは、毎回呼び出す必要がないことを意味します。この観点から、あなたのコードは単純にポインタを増やすことで実装を回避できるかもしれませんresseekBuffer

于 2012-04-18T13:14:07.150 に答える