【问题标题】:fseek(f,0,2); How does this work without SEEK_CUR / SEEK_SET or SEEK_END?fseek(f,0,2);如果没有 SEEK_CUR / SEEK_SET 或 SEEK_END,这将如何工作?
【发布时间】:2016-07-06 14:34:26
【问题描述】:

我无法理解它,我们不应该在哪里有 SEEK_CUR / SEEK_SET 或 SEEK_END 吗?为什么它有 2,它是如何工作的?

【问题讨论】:

    标签: c file fseek


    【解决方案1】:

    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 */
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        查看您的stdio.h

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

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

        【讨论】:

          【解决方案4】:

          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
          

          【讨论】:

            【解决方案5】:

            fseek() 接受三个参数。

            第一个是 FILE * 它将寻找

            第二个是int记录大小,值,预计一跳就跳。请注意,它也可以是负值。

            第三个参数是要完成跳跃的偏移值。它有三个可能的值 0,1 和 2。 0 代表文件的开头 1 代表当前位置 并且,2代表文件结束。

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

            【讨论】:

            • C11 说 SEEK_CUR, SEEK_END, SEEK_SET 是不同的值。它没有将它们指定为 0,1,2。
            • @chux,是的,它们是不同的。这就是为什么他们是三个。它是一个操作参数,精确的功能绑定。
            • 这个答案说“它有三个可能的值 0,1 和 2”。我的评论指出 C 规范不支持。虽然很常见,但兼容的编译器可以使用其他不同的值或不同的顺序。
            • 没错,这就是我称之为函数绑定的原因。无论是谁定义了这个函数(编译器/库供应商),这些值的命运都掌握在他们手中。 ;)
            猜你喜欢
            • 1970-01-01
            • 2021-03-16
            • 1970-01-01
            • 2013-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-25
            • 2023-03-19
            相关资源
            最近更新 更多