提问人:Recker 提问时间:10/22/2019 最后编辑:Recker 更新时间:10/23/2019 访问量:218
将 boost::filtering_streambuf 与 newline_filter 一起使用时为空文件
Empty file when using boost::filtering_streambuf with newline_filter
问:
我希望将一段数据写入通过使用 打开的文件。std::fopen
boost::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;
}
我在这里遗漏了一些明显的东西吗?
答:
1赞
sehe
10/23/2019
#1
我无法重现这种行为:
这用于编译和执行
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);
}
评论
1赞
Recker
10/24/2019
TBH,我意识到我正在使用命令检查文件输出,由于某种未知原因没有打印任何东西。.:P当我在 Windows 上用记事本打开文件的那一刻,我得到了正确的输出,即和相应的平台。cat
Unix(LF)
Windows(CRLF)
评论