簡體   English   中英

如何將 html 文件加載到內存中?

[英]How to load a html file to memory?

我想將一個 html 文件加載到內存中(實際上是一個 wchar_t 字符串)。 這是代碼:

size_t myGetFileSize(const wchar_t *wcPath)
{
    struct _stat fileinfo;
    _wstat(wcPath, &fileinfo);
    return (fileinfo.st_size);
}
int LoadUtf8FileToString(const wchar_t *wcFilename, wchar_t **wcBuffer)
{
    FILE* file = _wfopen(wcFilename, L"rtS, ccs=UTF-8");
    if (file == NULL)
        return (0);
    size_t filesize = myGetFileSize(wcFilename);
    if (filesize > 0)
    {
        *wcBuffer = (wchar_t*) malloc(filesize * sizeof(wchar_t));
        size_t nRead = fread(*wcBuffer, sizeof(wchar_t), filesize, file);
        realloc(*wcBuffer, nRead * sizeof(wchar_t));
    }
    fclose(file);
    return(1);
}

當我將它導航到 iwebbrowser2 時,它會在頁面末尾顯示所有頁面和 4 個空方塊! 我用谷歌搜索並找到了一個名為 wstring 的字符串類,並像這樣使用它:

std::wstring wString;
/////////////////////
wString->resize(filesize);
size_t wchars_read = fread(&(wString->front()), sizeof(wchar_t), filesize, file);
wString->resize(wchars_read);
wString->shrink_to_fit();

並將其導航到 iwebbrower2,一切都會好起來的! 但是我不喜歡在我的程序中使用任何類! 那么,請問我的代碼有什么問題?

你好像忘記了兩件事:一是UTF-8變長編碼,一個字符可能是一個字節,也可能是六個字節。 你不能把它當作固定寬度的編碼來讀。 您忘記的另一件事是您獲得的文件的大小不是文件中的字符數,而是文件中的字節數。

事實上,如果您正在閱讀 HTML 文件,很可能很多文本都是單個字節,即所有標記。

簡而言之,文件不包含filesize字符,它包含filesize字節 並且您嘗試讀取sizeof(wchar_t) * filesize字節,這就是fread調用將返回“錯誤”大小的原因。

  1. realloc已經完全過時了。 您初始化了正確的內存量(不是真的,見下文)並且讀取的字節數只有在fread以某種方式失敗並讀取較少字符的情況下才會有所不同。 再說一次,即使它這樣做並且您縮小(!)分配的緩沖區,您也忘記更新指針,因此它仍將指向原始內存塊。 這實際上被realloc釋放了。 您可能會擺脫這種未定義的行為,因為(顯然)要么就地調整了內存塊的大小,要么因為realloc確定不需要調整大小。

  2. 您在字符串的末尾獲得隨機字符,因為它是一個 string ,並且您沒有為終止零分配足夠的空間,也沒有編寫它。

  3. filesize以字節為單位。 因此分配和讀取bytes ,而不是wchar_t單位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM