在C++中有没有一种方法可以识别文件流?它并不重要是什么,只要从同一个文件创建的两个流具有相同的“id”;任何使我能够说从同一个文件创建的两个流是等效(而不是相等)的东西。
在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() )
{
...
}
然而,如果一个文件是通过不同的相对或绝对路径或别名打开的,则无法工作。您可以通过使用特定于操作系统的调用获取当前工作目录,并因此解析用于任何非绝对路径的完整路径来解决该问题。
我相信没有这样的方法。
假设程序员有足够的方法来跟踪不同的流,或者可以创建一个自定义结构将文件路径作为string
放在该结构内部,或类似的东西。例如,您可以创建如下结构:
struct FileStream {
char* FilePath;
istream FileStream;
}
然后要查看两个FileStream
是否在同一个文件上,您可以执行以下操作:
myStringCompare(fs1.FilePath, fs2.FilePath);
希望这能有所帮助。