使用libcurl/libtidy处理后写入文件出现信息丢失问题求助
问题分析与解决:libtidy输出写入文件不完整
你遇到的问题核心在于写入文件时错误计算了要写入的字节数,导致只写出了前几个字符。
先看你写入文件的这段代码:
auto * charArray = (char*) output.bp; file.write(charArray, sizeof(charArray));
这里的sizeof(charArray)得到的是指针类型本身的大小(32位系统是4字节,64位是8字节),而不是output.bp指向的实际数据长度——这就是为什么文件里只有<html it这短短几个字符的原因。
libtidy的TidyBuffer结构体自带了size字段,它专门存储缓冲区中实际数据的字节数,你需要用这个值来指定写入长度。
修正后的写入代码
std::ofstream file; file.open("C:/Testing/1.txt", std::ios_base::binary); assert(file.is_open()); auto* charArray = static_cast<char*>(output.bp); // 关键:使用output.size获取实际数据的字节数 file.write(charArray, output.size); file.close(); // 别忘了清理libtidy的资源,避免内存泄漏 tidyBufFree(&output); tidyBufFree(&errbuf); tidyRelease(tdoc);
额外提醒:curl请求的小疏漏
看你的curl代码片段,发现你漏掉了执行请求的关键步骤curl_easy_perform(curl)——如果没补这一步的话,readBuffer会是空的。这里给你补上完整的curl请求逻辑:
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); // 执行HTTP请求,这一步之前漏掉了! CURLcode res = curl_easy_perform(curl); if(res != CURLE_OK) { fprintf(stderr, "curl请求失败: %s\n", curl_easy_strerror(res)); } curl_easy_cleanup(curl); }
这样修改后,就能完整把libtidy处理后的XML/XHTML内容写入文件了。
内容的提问来源于stack exchange,提问作者user5118384
相关产品推荐
相关产品推荐

