ftell/feek在接近文件末尾时失败



读取文本文件(恰好是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几天前返回的值。它没有被破坏。

相同的代码适用于文件中的其他位置,并且只有在记住该位置时还有一行空行需要读取时才会失败。

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

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

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

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

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

假设您正在处理PDS成员,我会怀疑这是记录级I/O,它的处理方式与流I/O不同,流I/O在分布式实现中更常见。

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

相关内容

  • 没有找到相关文章

最新更新