写入后计算文件偏移量

发布于 2024-11-17 08:46:40 字数 233 浏览 3 评论 0原文

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

 offset, length, data

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

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

谢谢

I am writing a program where I log all writes to a file and just before process termination I write all writes in place i.e from log to actual file. Now, in the log each record of type something like :

 offset, length, data

After a write I need to calculate the offset so that I can lseek to that position when i finally write in the actual file so as to write the next write or for read.

Will current offset position+bytes written give me the file offset after a write.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

空宴 2024-11-24 08:46:40

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

Use fgetpos to get the file offset and fsetpos to set the file offset.

热血少△年 2024-11-24 08:46:40

有多种方法可以实现这一目标:

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

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

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

    1. 使用ftello()、fseeko()ftello64()、fseeko64()函数集。
  4. 第四种方式(便携性较差)

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

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

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

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

There are several ways to achieve that:

  1. First Way (In this case position will be updated automatically to how much you have read.)

    1. Read all log content into memory
    2. Sort them by (offset + length) growth
    3. Using consecutive read calls
  2. Second Way (most portable)

    1. Using fgetpos(), fgetpos64() and fsetpos(),fsetpos64() set of functions.
  3. Third Way

    1. Using ftello(), fseeko() and ftello64(), fseeko64() set of functions.
  4. Fourth Way (less portable)

    1. Using ftell(), fseek() and ftell64(), fseek64() set of functions.

The difference between func() and func64() is that func64() uses correct 64-bit offset which eliminates problem with files more than 4Gb, while func() uses int type which could be 32 or 64 bits, depending on the architecture.

The fseeko() and ftello() functions are identical to fseek() and ftell() except that the offset argument of fseeko() and the return value of ftello() is of type off_t instead of long.

As a conclusion the best practice is to use fgetpos64()/fsetpos64() or ftello64()/fseeko64().
As much as possible try to avoid any using of ftell() and fseek().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文