-1

私はバッファを持っています

char buffer[size];

ストリームのファイルコンテンツを保存するために使用しています(ここではpStreamを想定しています)

HRESULT hr = pStream->Read(buffer, size, &cbRead );

今、私はこのストリームのすべての内容をサイズのバッファに持っています(ここではサイズを仮定します)。今、私は2つの文字列を持っていることを知っています

"<!doctortype html" and ".html>" 

このバッファの保存されたコンテンツ内のどこかに存在し(私たちは彼らの場所ではありません)、その場所からバッファのコンテンツだけを保存したいです

"<!doctortype html" to another string ".html>"  

別の buffer2[SizeWeDontKnow] にはまだ入っていません。

どうやってするか ???(実際には、これら 2 つの場所のコンテンツは html ファイルのコンテンツであり、このバッファーに存在する html ファイルのコンテンツのみを保存したいと考えています)。それを行う方法はありますか??

4

4 に答える 4

1

strnstr 関数を使用して、バッファー内の正しい位置を見つけることができます。開始タグと終了タグを見つけたら、strncpy を使用して中間のテキストを抽出するか、パフォーマンスに問題がある場合はその場所で使用できます。
タグの位置と最初のタグの長さから必要なサイズを計算できます
nLength = nPosEnd - nPosStart - nStartTagLength

于 2013-07-23T13:43:08.537 に答える
0

それがアプリの HTML コードで動作する唯一の操作である場合は、以下で提供するソリューションを使用できます (オンラインでテストすることもできます -こちら)。ただし、より複雑な解析を行う場合は、外部ライブラリを使用することをお勧めします。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int main()
{
    const char* beforePrefix = "asdfasdfasdfasdf";
    const char* prefix = "<!doctortype html";
    const char* suffix = ".html>";
    const char* postSuffix = "asdasdasd";

    unsigned size = 1024;
    char buf[size];
    sprintf(buf, "%s%sTHE STRING YOU WANT TO GET%s%s", beforePrefix, prefix, suffix, postSuffix);

    cout << "Before: " << buf << endl;

    const char* firstOccurenceOfPrefixPtr = strstr(buf, prefix);
    const char* firstOccurenceOfSuffixPtr = strstr(buf, suffix);

    if (firstOccurenceOfPrefixPtr && firstOccurenceOfSuffixPtr)
    {
        unsigned textLen = (unsigned)(firstOccurenceOfSuffixPtr - firstOccurenceOfPrefixPtr - strlen(prefix));
        char newBuf[size];
        strncpy(newBuf, firstOccurenceOfPrefixPtr + strlen(prefix), textLen);
        newBuf[textLen] = 0;

        cout << "After: " << newBuf << endl;
    }

    return 0;
}

編集 私は今それを取得します:)。strstrthenの最初の出現を見つけるために使用する必要がありますprefix。上記のコードを編集し、リンクを更新しました。

于 2013-07-23T13:44:23.287 に答える