FSEEK(F,0,2);如果没有SEEK_CUR / SEEK_SET或SEEK_END,这如何运作?

时间:2016-07-06 14:34:27

标签: c file fseek

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

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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的注释中(最后)看到此值。

答案 2 :(得分:2)

查看您的public static class Config { static Config() { var doc = new XmlDocument(); using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Fully.Qualified.Name.Config.xml")) { if (stream == null) { throw new EndOfStreamException("Failed to read Fully.Qualified.Name.Config.xml from the assembly's embedded resources."); } using (var reader = new StreamReader(stream)) { doc.LoadXml(reader.ReadToEnd()); } } XmlElement aValue = null; XmlElement anotherValue = null; var config = doc["config"]; if (config != null) { aValue = config["a-value"]; anotherValue = config["another-value"]; } if (aValue == null || anotheValue == null) { throw new XmlException("Failed to parse Config.xml XmlDocument."); } AValueProperty = aValue.InnerText; AnotherValueProperty = anotherValue.InnerText; } }

stdio.h

因此,在预处理#define SEEK_END 2 /* Seek from end of file. */ 成为fseek(f, 0, SEEK_END)之后,编译器将看到fseek(f, 0, 2)而不是有意义的名称。结果我们可以完全避免使用这个名称并立即输入数值。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

fseek()有三个参数。

第一个是它将寻求的文件*

第二个是int记录大小,值,它有望跳跃一跳。请注意,它也可以是负值。

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

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