有什么方法可以识别流吗?

时间:2011-10-22 21:53:35

标签: c++ stream fstream

C ++中有没有办法识别文件流?只要从同一文件创建的两个流具有相同的“id”,它就不重要了。任何允许我说从同一个文件创建的两个流等效(不是相等)的东西。

3 个答案:

答案 0 :(得分:2)

唯一不是特定于操作系统操作系统的公共标识符是文件路径或设备名称本身,但是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() )
{
    ...
}

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

答案 1 :(得分:0)

据我所知,没有内置的方法来比较两个文件流。您可能要比较两个指针,这需要您跟踪相同的流(在您的情况下可能不可能,从问题的格式判断),或读取两个文件流中的数据而是比较它。

答案 2 :(得分:0)

我相信没有这样的方式。

假设程序员有足够的方法来自己跟踪不同的流,或者制作一个自定义的结构来放置,例如文件路径为该结构中的string或类似的东西。例如你可以有这样的结构:

struct FileStream {
    char* FilePath;
    istream FileStream;
}

然后要查看两个FileStream是否在同一个文件中,您可以执行以下操作:

myStringCompare(fs1.FilePath, fs2.FilePath);

我希望这会有所帮助。