您可以在origin
之类的函数中使用三个fseek
常量来确定offset
的计数位置:SEEK_SET
,SEEK_CUR
和{ {1}}。 SEEK_END
和SEEK_CUR
似乎很不明确,它表示文件流的当前位置和结尾,但是为什么SEEK_END
被用来表示文件流的开头?为什么不像SEEK_SET
这样的东西?
答案 0 :(得分:4)
因为您可以添加偏移量。通过使用SEEK_SET
,可以显式设置偏移量。 (通过将其添加到开头)
来自fseek的联机帮助页:
The new position, measured in bytes, is
obtained by adding offset bytes to the position specified by whence.
If whence is set to SEEK_SET, SEEK_CUR, or SEEK_END, the offset is
relative to the start of the file, the current position indicator, or
end-of-file, respectively.
在lseek的联机帮助页中:
SEEK_SET
The file offset is set to offset bytes.
SEEK_CUR
The file offset is set to its current location plus offset
bytes.
SEEK_END
The file offset is set to the size of the file plus offset
bytes.
答案 1 :(得分:1)
上述问题的另一个答案是“因为fseek
的第二个参数并不总是为零”。
如果 ,您始终将第二个参数传递为零,那么SEEK_CUR
会将文件指针设置为其当前位置(这几乎是无用的否) -op),然后SEEK_END
会将文件指针设置为文件末尾,而SEEK_CUR
会将其设置为文件的开头,这可能使您想知道为什么未将其命名为{{ 1}}。
但是当然SEEK_BEG
确实有第二个参数,并且您通常将其作为一个有趣的非零偏移量传递。很多时候,第二个参数是您要寻求的绝对偏移量,这就是fseek
的意思。为了方便起见,您还可以设置一个位置,即在当前位置上加上或减去当前位置(SEEK_SET
用于该位置),或者在文件的结尾处加上或减去当前位置,即SEEK_CUR
是。
在SEEK_END
为whence
且偏移量为 0的情况下,这意味着您尝试将文件指针设置为文件的开头,也许也应该是一个方便的捷径。但是快捷方式并没有称为SEEK_SET
,它是一个完全不同的库函数:SEEK_BEG
,它实际上是rewind(fp)
的快捷方式。