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

问题描述 投票:0回答:1

我想使用std::fopenboost::iostreams::filtering_streambuf将数据写入通过newline_filter打开的文件。

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

它只会产生一个空文件。

#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;
}

这里是否有明显的我想念的东西?

c++ boost iostream boost-iostreams
1个回答
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*?我假设您之所以将其包含在内,是因为仅使用旧版代码。


¹清单:

#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);
}
© www.soinside.com 2019 - 2024. All rights reserved.