在C++中调用md4c库传递C风格字符串时解析异常求助
问题:md4c库Markdown转HTML输出异常
我尝试在C++程序中集成md4c库实现Markdown转HTML功能,按照文档调用md_html()函数,但输出结果异常:输入的Markdown内容每个标签里都包含了整个文档的内容。
我的代码
#include <stdio.h> #include <string> #include <fstream> #include <sstream> #include "Libs/md4c-html.h" #define MD4C_USE_UTF8 void SaveTextToFile(const MD_CHAR* text, MD_SIZE size, void* unneeded) { std::string fileUrl = "../../outputfile.html"; std::ofstream file; file.open(fileUrl, std::ios_base::app); file << text; file.close(); text = 0; } int main() { std::ifstream file; file.open("../../inputfile.md"); std::stringstream buffer; buffer << file.rdbuf(); file.close(); std::string text = buffer.str(); int length = text.length(); int endCode = md_html(text.c_str(), length, SaveTextToFile, NULL, 0, 1); printf("program finished with code %i\n", endCode); }
输入与输出
输入Markdown:
# header1 paragraph
输出HTML:
<h1>header1 paragraph </h1> <p>paragraph </p>
错误分析与修正
问题出在回调函数SaveTextToFile的实现上:
- 未按指定长度输出内容:md4c传入的
text是分段的二进制缓冲区,并非以\0结尾的C风格字符串,直接用file << text会读取到内存中第一个\0为止,导致超出当前分段范围,把后续内容也写入到当前标签里。 - 频繁打开关闭文件:每次回调都打开关闭文件,虽不是直接错误原因,但会降低效率。
修正后的回调函数(推荐写法)
void SaveTextToFile(const MD_CHAR* text, MD_SIZE size, void* unneeded) { static std::ofstream file("../../outputfile.html"); // 仅初始化一次,自动覆盖旧文件 if (file.is_open()) { // 按指定长度写入当前分段内容 file.write(text, size); } }
若需要每次运行前清空文件的写法
int main() { // 先清空输出文件 std::ofstream clearFile("../../outputfile.html", std::ios_base::trunc); clearFile.close(); // 读取输入文件 std::ifstream file("../../inputfile.md"); std::stringstream buffer; buffer << file.rdbuf(); file.close(); std::string text = buffer.str(); int length = text.length(); int endCode = md_html(text.c_str(), length, SaveTextToFile, NULL, 0, 1); printf("program finished with code %i\n", endCode); } void SaveTextToFile(const MD_CHAR* text, MD_SIZE size, void* unneeded) { std::ofstream file("../../outputfile.html", std::ios_base::app); if (file.is_open()) { file.write(text, size); } file.close(); }
核心修正点是使用file.write(text, size)替代file << text,确保只写入当前分段的指定长度内容,避免读取缓冲区外的多余数据。
内容的提问来源于stack exchange,提问作者DressOrc
相关产品推荐
相关产品推荐

