gpt4 book ai didi

c++ - 将 boost::filtering_streambuf 与 newline_filter 一起使用时为空文件

转载 作者:行者123 更新时间:2023-11-30 04:42:58 26 4
gpt4 key购买 nike

我希望使用 boost::iostreams::filtering_streambufnewline_filter 将一段数据写入通过 std::fopen 打开的文件>.

这是我一直在尝试使用的一个小型可重现测试用例。

它只是生成一个空文件。

#include <string>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <errno.h>

#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/filter/newline.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <iosfwd>
#include <string>
#include <boost/iostreams/flush.hpp>
#include <boost/iostreams/operations.hpp>
#include <fstream>
#include <cstdio>

int main()
{
FILE *fp = nullptr;

std::string d ("file");

fp = std::fopen(d.c_str(), "w");
const int fd = fileno(fp);

boost::iostreams::file_descriptor_sink output(fd, boost::iostreams::never_close_handle);
boost::iostreams::filtering_streambuf<boost::iostreams::output>obuf;

#if defined(_WIN32)
obuf.push(boost::iostreams::newline_filter(boost::iostreams::newline::dos));
#else
obuf.push(boost::iostreams::newline_filter(boost::iostreams::newline::mac));
#endif

obuf.push(output);

std::ostream buffer(&obuf);

std::string myteststr = "Hello \n World\n";
buffer << myteststr;

buffer.flush();
boost::iostreams::flush(obuf);

return 0;
}

我在这里明显遗漏了什么吗?

最佳答案

我无法重现该行为:

Live On Coliru ¹

这用于编译和执行

g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp -lboost_{system,iostreams} && ./a.out
file output.txt
xxd output.txt

打印

output.txt: ASCII text, with CRLF line terminators
00000000: 4865 6c6c 6f20 0d0a 2057 6f72 6c64 0d0a Hello .. World..

我确实建议添加明确的 fd 关闭,尽管这在技术上不重要。

此外,2019 年是否有任何理由使用 FILE*?我假设您将其包括在内是因为仅使用它的遗留代码。


¹ list :

#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/iostreams/filter/newline.hpp>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/flush.hpp>
#include <cstdio>
#include <iostream>
#include <string>

int main() {
FILE* fp = std::fopen("output.txt", "w");
const int fd = fileno(fp);

boost::iostreams::file_descriptor_sink output(fd, boost::iostreams::never_close_handle);
boost::iostreams::filtering_streambuf<boost::iostreams::output> obuf;

obuf.push(boost::iostreams::newline_filter(boost::iostreams::newline::dos));
obuf.push(output);

std::ostream buffer(&obuf);

std::string myteststr = "Hello \n World\n";
buffer << myteststr;

buffer.flush();
boost::iostreams::flush(obuf);

::close(fd);
}

关于c++ - 将 boost::filtering_streambuf 与 newline_filter 一起使用时为空文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58505443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com