繁体   English   中英

fseek(f,0,2); 没有SEEK_CUR / SEEK_SET或SEEK_END怎么办?

[英]fseek(f,0,2); How does this work without SEEK_CUR / SEEK_SET or SEEK_END?

我听不懂,难道我们不应该在哪里有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代表当前位置And,2代表文件的结尾。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM