所以给出一个包含100个字节的二进制文件。我很确定INVALID应该导致错误,但为什么不呢?我很困惑,INVALID中的一次应该会出现语义错误吗?或者我误解了什么
/* VALID */ fseek(fp, sizeof(char) * 2, SEEK_SET);
/* VALID */ fseek(fp, -2 * sizeof(char), SEEK_END);
/* INVALID */fseek(fp, sizeof(char)* 2, SEEK_END);
/* INVALID */fseek(fp, -2 * sizeof(char), SEEK_SET);
/* INVALID */fseek(fp, 50, SEEK_CUR);
/* VALID */ fseek(fp, -50, SEEK_CUR);
/* INVALID */ fseek(fp, 51, SEEK_CUR);
/* INVALID */ fseek(fp, -51, SEEK_CUR);
答案 0 :(得分:2)
你在说什么“语义错误”?
无效的文件位置将导致fseek
失败,这将由fseek
的返回值指示。您必须接收该值并对其进行分析以确定该功能是否成功。上面的代码完全忽略了fseek
的返回值。
请注意,标准库不需要所有平台都支持SEEK_END
定位。平台可能不知道文件末尾的确切位置(直到您在读取文件时碰到它)。例如,某些文件系统可能不会以字节为单位存储确切的文件大小,而是存储文件占用的“块”或“扇区”数,这只能用作近似文件大小。因此,语言规范声明SEEK_END
定位不能保证得到有意义的支持。
另外请记住,在某些平台上,可能完全允许寻找超过文件结尾的文字。随后的写操作将在新位置写入数据,同时用零填充“间隙”。
答案 1 :(得分:0)
我不知道你正在使用什么样的操作系统(事实上你说“二进制文件”表示它是Windows),但在基于Unix的系统上,“搜索”操作实际上并没有立即执行任何操作。所以它不太可能崩溃。
以下是 lseek 函数的描述摘录, fseek 和朋友使用的核心Unix函数,根据 Unix环境中的高级编程由W. Richard Stevens撰写:
每个打开的文件都有一个关联的“当前文件偏移量”,通常是一个非负整数,用于衡量文件开头的字节数。读写操作通常从当前文件偏移量开始,并使偏移量增加...
lseek 仅记录内核中的当前文件偏移量 - 它不会导致任何I / O发生。然后,下一个读或写操作将使用此偏移量。
简而言之, fseek 更改的内容可能只是结构中的整数变量。只有在请求实际的I / O操作时,Unix内核才会访问文件系统。所以“不可能”的职位不会导致崩溃。