【发布时间】:2016-07-06 14:34:26
【问题描述】:
我无法理解它,我们不应该在哪里有 SEEK_CUR / SEEK_SET 或 SEEK_END 吗?为什么它有 2,它是如何工作的?
【问题讨论】:
我无法理解它,我们不应该在哪里有 SEEK_CUR / SEEK_SET 或 SEEK_END 吗?为什么它有 2,它是如何工作的?
【问题讨论】:
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() 接受三个参数。
第一个是 FILE * 它将寻找
第二个是int记录大小,值,预计一跳就跳。请注意,它也可以是负值。
第三个参数是要完成跳跃的偏移值。它有三个可能的值 0,1 和 2。 0 代表文件的开头 1 代表当前位置 并且,2代表文件结束。
SEEK_END、SEEK_CUR 或 SEEK_SET 只是宏扩展,其值分别为 2,1 和 0。因此,当用户使用这些宏扩展而不是使用下面的实际值时,预处理器会将每个此类用法替换为其各自的值,并且编译会照常进行。
【讨论】:
SEEK_CUR, SEEK_END, SEEK_SET 是不同的值。它没有将它们指定为 0,1,2。