我无法理解它,我们不应该有SEEK_CUR / SEEK_SET或SEEK_END吗?为什么它有2个,它是如何工作的?
答案 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。因此,当用户使用这些宏扩展而不是使用下面的实际值时,预处理器会将每个这样的用法替换为其各自的值,并且编译将照常进行。