读取文本文件(恰好是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
来到达该位置,我强烈建议使用fgetpos
和fsetpos
来代替数据集I/O。您不仅可以避免发现的这个问题,而且对于某些数据集特性,它的性能也更好。