c++ - 有什么方法可以识别流?

标签 c++ stream fstream

C++ 有什么方法可以识别文件流吗?它是什么并不重要,只要从同一个文件创建的两个流具有相同的“id”即可;任何可以让我说从同一个文件创建的两个流是等价(不是相等)的东西。

最佳答案

唯一不特定于操作系统的通用标识符是文件路径或设备名称本身,但 iostream 对象不提供对该信息的访问。

一种解决方案是对流对象进行子类化并提供您需要的功能。一个不令人满意的例子:

class id_fstream : public std::fstream
{
    public :
        id_fstream( const char * filename, 
                    ios_base::openmode mode = ios_base::in | ios_base::out ) : 
                  fstream( filename, mode ), m_filename( filename)
        { 
            // do nothing
        } ;

        const std::string& filename()
        {
            return m_filename ;
        }

    private :
        std::string m_filename ;
} ;

然后你可以编写如下代码:

if( id_fstreamA.filename() == id_fstreamB.filename() )
{
    ...
}

但是,如果一个文件是用不同的相对路径或绝对路径或通过别名打开的,则它不起作用。您可以通过特定于操作系统的调用获取当前工作目录,然后将完整路径解析为所用的任何非绝对路径,从而解决该问题。

关于c++ - 有什么方法可以识别流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862859/

相关文章:

c++ - 翻译 CGAL 多边形而不循环遍历顶点

ios - Swift 上基于流的 JSON 解析

c++ - 读取二进制文件时如何输出?

c++ unget on fstreams是否安全

c++字符串在打印时缩短了两倍

c++ - 跨平台C++ : convert to/from UTC/local time WITH historical tzdata

c# - 将 ReadAsStreamAsync 与 StreamReader 一起使用时出现 "stream was not readable"ArgumentException

java - Java 管道流 'stored' 的内容在哪里?

c++ - 在 mac 上执行 .app 时,fstream 和 qfile 不创建文件

c++ - std::map 覆盖错误的键