首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ ofstream对basic_ofstream

C++ ofstream对basic_ofstream
EN

Stack Overflow用户
提问于 2018-08-24 15:30:37
回答 2查看 938关注 0票数 3

我很困惑。

我正在学习ofstream,似乎它实际上是一个basic_ofstream,如下所示:

一个名为basic_ofstream的类有一个名为ofstream的构造函数,其原因是什么?“基本”意味着有一个非基本版本。为什么构造函数名与类名不同?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-24 15:40:54

没有名为ofstream的构造函数(构造函数没有名称),也没有名为basic_ofstream的类(尽管微软文档声称)。

basic_ofstream是一个类模板(与类不同),ofstream是一个typedef名称a.k.a。键入别名,它引用该模板的一个实例化,特别是basic_ofstream<char>

wofstream是另一个这样的名称,指的是basic_ofstream<wchar_t>

这是C++标准库用于定义不同字符类型的不同类型的命名约定。遵循这一约定的另一组名称是basic_stringstringwstring

票数 6
EN

Stack Overflow用户

发布于 2018-08-24 15:44:49

这不是不同名称的构造函数。这是一种专业化。所以basic_ofstream是一个模板。然后有两个“快捷方式名称”:

代码语言:javascript
复制
ofstream    for basic_ofstream<char>
wofstream   for basic_ofstream<wchar_t>

为什么他们被命名为basic..。也许是因为标准库只提供基本版本,而客户端可以编写非基本类并将它们插入。如果您查看c++标准io库图,所有组件的前缀都是"basic“。

通常是通过替换basic_streambuf将定制的streambuf绑定到stream。一个来自boost的例子

代码语言:javascript
复制
#include <ostream>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/stream.hpp>

namespace io = boost::iostreams;

int main()
{
    io::stream_buffer<io::file_sink> buf("log.txt");
    std::ostream                     out(&buf);
    // out writes to log.txt
}

它是一个使用std::ostream的缓冲区实现。

如果您想探索漂亮的实现,可以从boost::iostreams库和它们的示例中查看更多内容。不错的是和gzip在一起。它适用于ifstream

代码语言:javascript
复制
#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>

int main() 
{
    using namespace std;

    ifstream file("hello.gz", ios_base::in | ios_base::binary);
    filtering_streambuf<input> in;
    in.push(gzip_decompressor());
    in.push(file);
    boost::iostreams::copy(in, cout);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52007601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档