【问题标题】:What are the standard C++ equivalents for embarcadero/borland TMemoryStream and TFileStream?embarcadero/borland TMemoryStream 和 TFileStream 的标准 C++ 等效项是什么?
【发布时间】:2018-08-14 12:49:35
【问题描述】:

我找到了遗留源代码,这里摘录 -

TMemoryStream *DFile = new TMemoryStream;
TFileStream*BFile = new TFileStream;

以下是上述类的一些官方记录数据:


  • TMemoryStreamTFileStream 有相同的用途吗?

  • 如果我们暂时考虑二进制数据输出流,那么我们可以 将TMemoryStream & TFileStream替换为std::ostream & 分别是std::ofstream

  • (我有点困惑)何时分别使用编译器特定的TMemoryStreamTFileStreamover std::ostreamstd::ofstream

    • 如果我们进行上述事情,我们可以获得哪些优势?

【问题讨论】:

  • 没有直接的标准 C++ 等价物,因为我们不知道那些 3rd 方类是什么。有多个继承级别,TObject 是基类。标准 C++ 中没有 TObject 的等价物。
  • @Ron for TMemoryStream 他们提到了"Use TMemoryStream to store data in a dynamic memory buffer that is enhanced with file-like access capabilities" ...动态内存? std::ofstream 不这样做吗?
  • 换句话说,您找到了一些 C++Builder 代码,但不知道如何将其转换为普通的标准 C++?
  • FWIW,我是一名资深人士,当演员表有意义时,我不介意演员表。

标签: c++ c++builder ofstream ostream


【解决方案1】:

TMemoryStream 和 TFileStream 有相同的用途吗?

它们的界面相似,但用途不同。 TMemoryStream 从/向内存块读取/写入数据。 TFileStream 改为从文件读取/写入数据。

如果我们暂时考虑二进制数据输出流,那么我们可以将TMemoryStreamTFileStream 分别替换为std::ostreamstd::ofstream 吗?

TFileStream 写入文件。 std::ofstream 写入文件。所以,你可以用std::ofstream替换TFileStream,是的。

TMemoryStream 有点棘手。 TMemoryStream 写入根据需要动态(重新)分配的内存块。没有用于写入动态内存块的标准 C++ 流。除非您考虑std::ostringstream,它用于输出字符串,而不是二进制数据。或者std::vector<char>,它是动态的,但没有流接口。

但是,std::ostream 几乎可以与您想要的任何std::streambuf 一起使用,并且有许多第三方自定义std::streambuf 实现可用于从/向(动态)内存读取/写入。例如,this one 写入 std::array<char, N>,但您可以将其改写为写入 std::vector<char>。或者找到另一个适合您需求的实现。或者自己写。

何时分别使用编译器特定的 TMemoryStreamTFileStream 而不是 std::ostreamstd::ofstream

当您需要直接与 Borland/Embarcadero 的 RTL/VCL/FMX 框架交互时,请使用 TMemoryStream/TFileStream。否则,您应该使用标准 C++ 类。

【讨论】:

  • 谢谢,我之前看到过那个网站,问题是不能带第 3 方的东西兄弟。是的,我会实现我自己的功能......,,
  • Remy 的问题是.. 我必须将这些老式的 borland 东西转换为 std 现代的东西(关于便携性),这就是我苦苦挣扎的原因.. 希望你能理解我的情况 :)跨度>
【解决方案2】:

流是 C++ IO 库的一部分。特别是std::fstreamhttp://en.cppreference.com/w/cpp/io/basic_fstream)支持文件流,std::stringstreamhttp://en.cppreference.com/w/cpp/io/basic_stringstream)表示内存流

【讨论】:

  • 哦.. 用std::ostream 代替std::stringstream 代替TMemoryStream 有错吗?
  • std::ostream是stringstream和fstream实现的抽象类
  • @UKMonkey 这不是真的。 std::ostream 不是抽象类。
  • @BuddhikaChaturanga 我不会说这是错的,它只是在功能方面没有给你太多。
  • 谢谢你的信息,我会选择std::ofstream 然后.. 它既方便又安全.. Sergey,只是怀疑他们在 wiki 中提到的dynamic memory 部分。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多