【问题标题】:Why using SEEK_END doesn't work here?为什么在这里使用 SEEK_END 不起作用?
【发布时间】:2013-11-20 08:55:43
【问题描述】:

所以我正在尝试从大学的 sn-p 学习 C 文件 IO 操作。我的问题是 SEEK_END 无法正常工作,因为我期望它可以正常工作。

让我们为您提供更多详细信息:

输入.txt:

abcd-abcd-abcd

代码:

int fd, fdr, l1, l2, wb1, wb2;
char buf[25];

fd = open("input.txt", O_WRONLY);
fdr = open("input.txt", O_RDONLY);

l1 = lseek(fd, -3, SEEK_END);
wb1 = write(fd, "xy", 2);

l2 = lseek(fd, 4, SEEK_SET);
write(fd, "12", 2);

lseek(fdr, 0, SEEK_SET);
wb2 = read(fdr, buf, 20);
write(1, buf, wb2);

我的问题是写“xy”。我希望输出是

abcd12bcd-axyd

其实是

abcd12bcd-abcd

为什么不写“xy”?

【问题讨论】:

  • 按预期在此处工作 (gcc (Debian 4.4.5-8) 4.4.5),将abcd12bcd-axyd 写入控制台。
  • 如果查看input.txt 的文件大小(使用shell 或任何文件浏览器),您在运行程序之前和之后会得到什么? 14?
  • 您在哪个平台/操作系统上遇到过这种行为?

标签: c file-io seek lseek


【解决方案1】:

在从另一个句柄读取文件之前关闭只写文件(或同步数据到磁盘)。

在您的情况下,数据已写入文件,但尚未同步到磁盘。因此,当第二个句柄尝试读取数据时,它会获取旧数据。

int fd, fdr, l1, l2, wb1, wb2;
char buf[25];

fd = open("input.txt", O_WRONLY);
fdr = open("input.txt", O_RDONLY);

l1 = lseek(fd, -3, SEEK_END);
wb1 = write(fd, "xy", 2);

l2 = lseek(fd, 4, SEEK_SET);
write(fd, "12", 2);

close(fd); 

lseek(fdr, 0, SEEK_SET);
wb2 = read(fdr, buf, 20);
write(1, buf, wb2);

【讨论】:

    【解决方案2】:

    您需要在再次读取之前将数据同步到磁盘。因为在您读取数据时并未写入数据。您需要在读取之前关闭文件。

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 2019-02-10
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多