【问题标题】:How to write to specific offset in empty file如何写入空文件中的特定偏移量
【发布时间】:2012-02-01 17:55:33
【问题描述】:

我有一个文件,我在其中读取数据。假设文件有字符串“abcdefghij”。现在,我将从不同进程中随机读取文件,并将该字节和偏移量存储在某处。例如,我将“c”保存为我的角色,偏移量为“3”,因为那是它的位置。作为参考,我一直在使用 lseek 来获取文件中的偏移量。

接下来,我想将其写入一个新文件。是否可以写入空文件中的特定偏移量?所以,我想将'c'写入文件中的'3'位置,然后另一个进程会将'j'写入文件中的位置10。

【问题讨论】:

  • 在空文件中谈论偏移是没有意义的。您必须添加一些填充字符。
  • 这是绝对必要的吗?因为如果我的源文件包含 100 甚至 1000 个字符。写到第 1000 个位置可能需要一段时间,并且需要我填满直到那个位置的每个空间。如果可能的话,我只是想避免这种情况。
  • @canistr:你无法避免。到那时为止的空间绝对必须被填满。必须由您明确填写,否则系统会为您隐式填写。没有办法解决它。这两种场景之间的性能不会有明显差异。
  • 我想收回我的回答。请取消接受。

标签: c linux file


【解决方案1】:
#include <stdio.h>

int main ()
{
    FILE * f = fopen ("/tmp/x.txt", "w");

    fseek (f, 3, SEEK_SET);
    fwrite ("c", 1, 1, f);

    fseek (f, 10, SEEK_SET);
    fwrite ("j", 1, 1, f);

    fclose (f);
}

运行时,/tmp/x.txt 的 hexdump 为

00 00 00 63 00 00 00 00  00 00 6a          | ...c.... ..j

fseek 基于文件中的capable of recognising "holes" lseek(尚未写入的零范围),但底层文件系统需要支持这一点。

从联机帮助页中我并没有清楚地看到这些孔严格要求为零,但实际上似乎就是这种情况。

【讨论】:

    【解决方案2】:

    查看ftello。然后使用fwrite。 如果您使用 fd 而不是 FILE*s,您也可以使用 lseek/write

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多