3

读取文本文件(恰好是 PDS 成员 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前面几行返回的值。它没有被损坏。

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

我对 SO的另一个答案简洁地理解了我对如何ftell/应该工作的理解。fseek

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

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

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

4

2 回答 2

0

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

于 2020-07-16T18:46:18.547 回答
0

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

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

于 2020-07-16T15:45:56.167 回答