【问题标题】:ftell/fseek fail when near end of fileftell/fseek 在接近文件末尾时失败
【发布时间】:2020-07-16 15:06:40
【问题描述】:

读取文本文件(恰好是 PDS Member FB 80)

hFile = fopen(filename,"r");

并且已经到达文件中只剩下一个空行的位置。

FilePos = ftell(hFile);

然后读取最后一行,其中只包含一个'\n' 字符。

fseek(hFile, FilePos, SEEK_SET);

失败:-

errno=(27) EDC5027I The position specified to fseek() was invalid.

fseek() 指定的位置在几行之前由ftell() 返回。在我看到的特定错误情况下,它的值为 841。通过调试器检查,这也是前面几行 ftell 返回的值。它没有被损坏。

相同的代码适用于文件中的其他位置,并且仅在记住该位置时剩下一个空行要读取的点处失败。

我对@9​​87654330@/fseek 应该如何工作的理解被另一个answer on SO 简洁地捕捉到了。

从文本流上的 ftell 返回的值与您目前阅读的字符数没有可预测的关系。您唯一可以依赖的是,您可以随后将其用作 fseek 或 fseeko 的偏移量参数以移回相同的文件位置。

似乎我不能依赖我应该能够依赖的一件事。

我的问题是,为什么fseek 会以这种方式失败?

【问题讨论】:

  • 试试export _EDC_ZERO_RECLEN=Y
  • 有趣,我会试一试 - 有一个 '\n' 被认为是零?
  • 再想一想,流打开是文本模式还是二进制模式?
  • @meat - 如问题中所述,它是一个文本文件,并以“r”打开。将更新问题文本以反映这一点。
  • @MilosLalovic - 我终于开始尝试您的建议,但没有任何区别。

标签: file-io mainframe zos fseek ftell


【解决方案1】:

由于 z/OS 有一些独特的文件格式,您可能会在这篇 Knowledge Center 文章中找到答案。

鉴于您正在处理 PDS 成员,我怀疑这是记录级 I/O,其处理方式与流式 I/O 不同,后者在分布式实现中更为常见。

【讨论】:

  • POSIX 文件函数支持在流模式下从顺序源(在本例中为 PDS 成员)读取。
  • @Hogstrom - 请注意,我没有使用type=record 开放模式参数。所以这不是记录级 I/O。 PDS成员只是一个小文本文件,Fixed Block 80,没什么复杂的。
【解决方案2】:

我不知道为什么fseek会以这种方式失败,但是如果您的常见使用模式是使用ftell获取位置然后fseek去那个位置,我强烈建议使用fgetposfsetpos 代替数据集 I/O。您不仅可以避免您发现的这个问题,而且在某些数据集特征方面表现也更好。

【讨论】:

  • 谢谢 - 这实际上是我在此期间所做的,但我也想深入了解问题,因为这对我来说肯定不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2011-04-01
  • 2016-03-04
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多