【问题标题】:Calculating file offset after a write写入后计算文件偏移量
【发布时间】:2011-06-26 13:52:21
【问题描述】:

我正在编写一个程序,将所有写入记录到文件中,并且在进程终止之前,我将所有写入写入到位,即从日志到实际文件。现在,在日志中,每条记录的类型都类似于:

 offset, length, data

写入后我需要计算偏移量,以便在我最终写入实际文件时可以找到该位置,以便写入下一个写入或读取。

当前偏移位置+写入的字节数会在写入后给我文件偏移量吗?

谢谢

【问题讨论】:

    标签: c linux file offset


    【解决方案1】:

    使用fgetpos获取文件偏移量,使用fsetpos设置文件偏移量。

    【讨论】:

    • @David..我需要计算读取或写入后的文件偏移量
    • ftell/fgetpos 这样做:告诉你“文件位置指示器”...相对于开头的偏移量;否则,与上一个位置的偏移量只是写入/读取的数据数...... - 所以最后一行的答案是“是”。
    【解决方案2】:

    有几种方法可以实现:

    1. 第一种方式(在这种情况下,位置将自动更新为您已阅读的内容。)

      1. 将所有日志内容读入内存
      2. 按(偏移量 + 长度)增长对它们进行排序
      3. 使用连续读取调用
    2. 第二种方式(最便携)

      1. 使用 fgetpos()、fgetpos64()fsetpos()、fsetpos64() 函数集。
    3. 第三条路

      1. 使用 ftello()、fseeko()ftello64()、fseeko64() 函数集。
    4. Fourth Way(不太便携)

      1. 使用 ftell()、fseek()ftell64()、fseek64() 函数集。

    func()func64() 的区别在于 func64() 使用正确的 64 位偏移量,从而消除了超过 4Gb 文件的问题,而 func( ) 使用 int 类型,可以是 32 位或 64 位,具体取决于架构。

    fseeko()ftello() 函数与 fseek()ftell() 相同除了 fseeko() 的 offset 参数和 ftello() 的返回值是 off_t 类型而不是 long

    作为结论,最佳实践是使用 fgetpos64()/fsetpos64() 或 ftello64()/fseeko64()。 尽可能避免使用 ftell() 和 fseek()。

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 1970-01-01
      • 2018-04-13
      • 2019-07-17
      • 1970-01-01
      • 2013-08-24
      • 2021-04-10
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多