为什么这没有故意使无效的文件定位没有引起任何错误

时间:2012-12-09 01:42:48

标签: c file positioning binaryfiles fseek

所以给出一个包含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);

2 个答案:

答案 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内核才会访问文件系统。所以“不可能”的职位不会导致崩溃。