gpt4 book ai didi

c++ - 通过函数打开流

转载 作者:太空狗 更新时间:2023-10-29 20:00:31 25 4
gpt4 key购买 nike

我需要有关 [io](f)stream 不可复制性质的帮助

我需要提供一个关于 fstream 的 hackish 包装器s 以便在 Windows 上处理文件名中包含 unicode 字符的文件。为此,我设计了一个包装函数:

bool open_ifstream( istream &stream, const string &filename )
{
#ifdef __GLIBCXX__
FILE* result = _wfopen( convert_to_utf16(filename).c_str(), L"r" );
if( result == 0 )
return false;

__gnu_cxx::stdio_filebuf<char>* buffer = new __gnu_cxx::stdio_filebuf<char>( result, std::ios_base::in, 1 );
istream stream2(buffer);
std::swap(stream, stream2);

#elif defined(_MSC_VER)
stream.open( convert_to_utf16(filename) );
#endif
return !!stream;
}

当然还有 std::swap线是罪魁祸首。我也试过从函数返回流,但它导致了同样的问题。 std::istream 的拷贝构造函数是delete d.我也尝试了 std::move但这没有帮助。我该如何解决这个问题?

编辑: 我终于找到了 Keep It Simple (TM) 的好方法并且功能强大,这要归功于@tibur 的想法。从它依赖于所使用的 Windows 标准 C++ 库的意义上说,它仍然是 hackish,但由于只有两个 真正的 在使用,所以这对我来说不是真正的问题。

#include <fstream>
#include <memory>
#if _WIN32
# if __GLIBCXX__
# include<ext/stdio_filebuf.h>
unique_ptr<istream> open_ifstream( const string &filename )
{
FILE* c_file = _wfopen( convert_to_utf16(filename).c_str(), L"r" );
__gnu_cxx::stdio_filebuf<char>* buffer = new __gnu_cxx::stdio_filebuf<char>( c_file, std::ios_base::in, 1 );

return std::unique_ptr<istream>( new istream(buffer) );
}
# elif _MSC_VER
unique_ptr<ifstream> open_ifstream( const string &filename )
{
return unique_ptr<ifstream>(new ifstream( convert_to_utf16(filename)) );
}
# else
# error unknown fstream implementation
# endif
#else
unique_ptr<ifstream> open_ifstream( const string &filename )
{
return unique_ptr<ifstream>(new ifstream(filename) );
}
#endif

在用户代码中:

auto stream_ptr( open_ifstream(filename) );
auto &stream = *stream_ptr;
if( !stream )
return emit_error( "Unable to open nectar file: " + filename );

这取决于 C++0x <memory>auto关键词。当然你不能只是 close结果 stream变量,但 GNU Libstdc++ std::istream析构函数确实负责关闭文件,因此在任何地方都不需要额外的内存管理。

最佳答案

关于:

ifstream * open_ifstream(const string &filename);

关于c++ - 通过函数打开流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524821/

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