我们不应该使用SEEK_CUR
/SEEK_SET
或SEEK_END
来whence
吗?它如何仅使用固定值工作?
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 的宏扩展。因此,当用户使用这些宏扩展而不是使用下面的实际值时,预处理器会将每个此类用法替换为其各自的值,并且编译照常进行。