c - fseek(f,0,2);如何在没有SEEK_CUR/SEEK_SET或SEEK_END的情况下工作



我们不应该使用SEEK_CUR/SEEK_SETSEEK_ENDwhence吗?它如何仅使用固定值工作?

SEEK_SET/SEEK_CUR/SEEK_END分别为0/1/2,可以使用数字或定义。

请参阅此处的定义:http://unix.superglobalmegacorp.com/BSD4.4/newsrc/sys/unistd.h.html

/* whence values for lseek(2) */
#define SEEK_SET    0   /* set file offset to offset */
#define SEEK_CUR    1   /* set file offset to current plus offset */
#define SEEK_END    2   /* set file offset to EOF plus offset */

当然,直接使用这些数字是一种不好的做法,因为它可能会在未来的实现中发生变化(尽管不太可能)

因为SEEK_XXX是宏并且具有一定的值,在这种情况下,SEEK_END等于 2,所以它与 fseek(f,0,2) 相同 fseek(f,0,SEEK_END),但您应该始终使用宏。例如,您可以在 http://man7.org/linux/man-pages/man2/lseek.2.html 的注释(末尾)中看到此值。

查看您的stdio.h

#define SEEK_END    2   /* Seek from end of file.  */

因此,在预处理后,您的fseek(f, 0, SEEK_END)变为fseek(f, 0, 2)编译器将看到2而不是有意义的名称。因此,我们可以完全避免这个名称并立即输入数值。

stdio.h 中,

#ifndef SEEK_SET
#define SEEK_SET    0   /* set file offset to offset */
#endif
#ifndef SEEK_CUR
#define SEEK_CUR    1   /* set file offset to current plus offset */
#endif
#ifndef SEEK_END
#define SEEK_END    2   /* set file offset to EOF plus offset */
#endif

fseek() 接受三个参数。

第一个是它将寻求的文件 *

其次是int Record大小,值,它期望跳跃一次跳跃。请注意,它也可以是负值。

第三个参数是要完成此跳跃的偏移值。它有三个可能的值 0、1 和 2。0 表示文件的开头1 表示当前位置2 表示文件的结尾。

SEEK_END、SEEK_CUR或SEEK_SET只是值分别为 2、1 和 0 的宏扩展。因此,当用户使用这些宏扩展而不是使用下面的实际值时,预处理器会将每个此类用法替换为其各自的值,并且编译照常进行。

最新更新