将数组写入文件时信息丢失
Information loss while writing array to a file
我有问题。我想在我的电脑上使用 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
一切正常。
file.write(charArray, sizeof(charArray));
sizeof(charArray)
总是 8(在 64 位架构上),因为 charArray
是 char*
。这就是您向文件写入 8 个字符的原因。
要获取以 null 结尾的字符串的长度,您应该使用 std::strlen()
。但是,由于您使用的是 TidyBuffer
,因此可以改用 bp.size
,从而避免 O(N) 操作。
我有问题。我想在我的电脑上使用 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
一切正常。
file.write(charArray, sizeof(charArray));
sizeof(charArray)
总是 8(在 64 位架构上),因为 charArray
是 char*
。这就是您向文件写入 8 个字符的原因。
要获取以 null 结尾的字符串的长度,您应该使用 std::strlen()
。但是,由于您使用的是 TidyBuffer
,因此可以改用 bp.size
,从而避免 O(N) 操作。