【问题标题】:Information loss while writing array to a file将数组写入文件时信息丢失
【发布时间】:2018-05-16 17:11:24
【问题描述】:

我有问题。我想在我的电脑上使用 libcurl 和 libtidy 将 html 文件保存为 xml。

这是我为获取网站(在我的情况下用于测试 google.com)然后整理它而找到的代码。我从多个来源得到它并把它放在一起。

CURL *curl;
std::string readBuffer;

curl = curl_easy_init();
if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
    curl_easy_cleanup(curl);
}

const char* input = readBuffer.c_str();

TidyBuffer output = {0};
TidyBuffer errbuf = {0};
int rc = -1;
Bool ok;

TidyDoc tdoc = tidyCreate();
std::cout << "Tidying..." << std::endl;

ok = tidyOptSetBool(tdoc, TidyXhtmlOut, yes);
if (ok)
    rc = tidySetErrorBuffer(tdoc, &errbuf);
if (rc >= 0)
    rc = tidyParseString(tdoc, input);
if ( rc >= 0 )
    rc = tidyCleanAndRepair( tdoc );               
if ( rc >= 0 )
    rc = tidyRunDiagnostics( tdoc );               
if ( rc > 1 )                                    
    rc = ( tidyOptSetBool(tdoc, TidyForceOutput, yes) ? rc : -1 );
if ( rc >= 0 )
    rc = tidySaveBuffer( tdoc, &output );          

if ( rc >= 0 )
{
    if ( rc > 0 )
    printf( "\nAnd here is the result:\n\n%s", output.bp );
}
else
    printf( "A severe error (%d) occurred.\n", rc );

结果以byte * 的形式保存在output.bp 中。现在我尝试将其写入 .txt 文件,仅用于测试目的(稍后写入 xml 文件)。为此,我使用以下代码行:

std::ofstream file;
file.open("C:/Testing/1.txt", std::ios_base::binary);
assert(file.is_open());

auto * charArray = (char*) output.bp;

file.write(charArray, sizeof(charArray));

file.close();

在指定位置创建了一个文件,但只保存了几个字符:

<html it

文档的其余部分只是空的,没有更多的行或任何东西,这就是所有被保存的内容。我真的不知道为什么会发生这种情况,因为当打印出 output.bp 时一切正常。

【问题讨论】:

    标签: c++ curl libcurl


    【解决方案1】:
    file.write(charArray, sizeof(charArray));
    

    sizeof(charArray) 始终为 8(在 64 位架构上),因为 charArraychar*。这就是您在文件中写入 8 个字符的原因。

    要获取以空字符结尾的字符串的长度,您应该使用std::strlen()。但是,由于您使用的是TidyBuffer,因此您可以改用bp.size,避免 O(N) 操作。

    【讨论】:

    • 谢谢,我完全忘记了。我会尽快接受你的回答。
    • TidyBuffer 有一个 size 成员。我会在 strlen 上使用它,尤其是在保存二进制数据时。
    • @RetiredNinja 谢谢,我不熟悉TidyBuffer,我只是在处理手头的信息。我会修改答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2020-07-14
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多