有没有办法识别一个流?

3

在C++中有没有一种方法可以识别文件流?它并不重要是什么,只要从同一个文件创建的两个流具有相同的“id”;任何使我能够说从同一个文件创建的两个流是等效(而不是相等)的东西。


1
请问您的“identify”是指什么? - orangething
任何能让我断言两个从同一个文件创建的流是等效的东西。 - Paul Manta
1
你可以将每个流封装在一个结构体或类中,该结构体或类具有流和文件名加其内容的哈希作为成员。 - Ivan
@Ivan 当然可以,但我正在寻找标准类型中已经存在的东西,如果有的话。 - Paul Manta
我不认为存在类似的东西(请看下面我的回答)...可能有提供你所寻找的功能的库。 - mmtauqir
3个回答

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() )
{
    ...
}

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


0

我相信没有这样的方法。

假设程序员有足够的方法来跟踪不同的流,或者可以创建一个自定义结构将文件路径作为string放在该结构内部,或类似的东西。例如,您可以创建如下结构:

struct FileStream {
    char* FilePath;
    istream FileStream;
}

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

myStringCompare(fs1.FilePath, fs2.FilePath);

希望这能有所帮助。


0
据我所知,没有内置的方法来比较两个文件流。你要么比较两个指针,这需要你跟踪相同的流(根据问题的格式,这可能不可能在你的情况下),要么读取两个文件流中的数据并进行比较。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接