【问题标题】:Any way to identify a stream?有什么方法可以识别流吗?
【发布时间】:2011-12-13 08:29:49
【问题描述】:

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

【问题讨论】:

  • 你能解释一下你所说的“识别”是什么意思吗?
  • 任何可以让我说从同一个文件创建的两个流是等效的。
  • 您可以将每个流封装在一个结构或类中,该结构或类具有一个流和文件名的哈希以及其内容作为成员。
  • @Ivan 当然,但我一直在寻找标准类型中已经可用的东西,如果存在的话。
  • 我认为不存在类似的东西(请参阅下面的答案)......可能有图书馆可以提供您正在寻找的东西。

标签: c++ stream fstream


【解决方案1】:

据我所知,没有内置方法可以比较两个文件流。您要么必须比较两个指针,这将要求您跟踪相同的流(根据问题的格式判断,这在您的情况下可能是不可能的),或者读取两个文件流中的数据并进行比较。

【讨论】:

    【解决方案2】:

    我相信没有这样的方法。

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

    struct FileStream {
        char* FilePath;
        istream FileStream;
    }
    

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

    myStringCompare(fs1.FilePath, fs2.FilePath);
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-12
        • 2020-01-10
        • 2019-09-06
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        相关资源
        最近更新 更多