【问题标题】:Partially truncating a stream (fstream or ofstream) in C++在 C++ 中部分截断流(fstream 或 ofstream)
【发布时间】:2010-02-14 15:49:10
【问题描述】:

我正在尝试使用 fstream 部分截断(或缩短)现有文件。我曾尝试编写 EOF 字符,但这似乎无济于事。

任何帮助将不胜感激......

【问题讨论】:

    标签: c++ file truncate fstream ofstream


    【解决方案1】:

    我不认为你可以。有许多函数可以“上下”移动HANDLE<->int<->FILE * 的包装层次结构,至少在 Windows 上是这样,但是没有“适当的”方法可以从 iostreams 对象中提取 FILE *(如果它确实是用一个)。

    您可以找到this question 提供帮助。

    就我个人而言,我强烈建议不要使用 iostream,它们的设计很糟糕,大量使用 C++,而且看起来很难看。看看Boost's iostreams,如果你需要使用类,或者包装stdio.h

    stdio的相关函数是ftruncate()

    【讨论】:

      【解决方案2】:

      Boost.Interprocess 库定义了一个可移植的truncate 函数。出于某种原因,它没有记录在案,但您可以找到它this header file

      【讨论】:

      • ftruncate 在 Posix 中是可移植的。但它当然不使用 C++ 流。
      • 是的,我的意思是可移植到 Posix 和 Win32。
      【解决方案3】:

      这取决于操作系统。大多数操作系统都支持这一点,但方式不同。在 Windows 上,有一个 SetEndOfFile()。在 Unix 和类似系统上,您 lseek 到您希望文件结束的位置,并在那里执行一个零字节的 lwrite。其他操作系统无疑使用其他方法。

      【讨论】:

      • 在 Unix 上肯定会使用ftruncate(2)
      【解决方案4】:

      最后我咬紧牙关,读取文件中要保存到数组的部分,然后重新编写它。这不是最好的解决方案 - 但由于文件总是很小,我决定接受这种方法。

      【讨论】:

      • 为什么不直接使用 C 文件 I/O,而不是解决 C++ 流强加的限制(这似乎不适合您的任务)?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2017-01-08
      • 1970-01-01
      • 2015-08-03
      • 2011-02-21
      相关资源
      最近更新 更多