【发布时间】:2021-09-04 19:06:12
【问题描述】:
for (int i = 0; i < num - 1 - ct; i++) {
int tmp = k;
fread(&k, sizeof(int), 1, fp);
fflush(stdin);
fseek(fp, -(sizeof(int)), SEEK_CUR);
fwrite(&tmp, sizeof(int), 1, fp);
}
问题部分在上面。
我希望fseek 每次回滚 4 个字节。但它会回滚 8 个字节,或者可能会回滚到文件的开头。我无法让它正常工作。一个新生。提前致谢。
【问题讨论】:
-
隐藏
stdin的 fflush 的无意义和未定义行为性质,您是否真的通过检查结果代码验证了 任何 IO 调用?它们不仅仅是为了方便。他们可以帮助您找出潜在问题。 -
您没有显示
k的定义位置或循环前的初始化方式。您如何确定fseek()反转了 8 个字节而不是 4 个字节?您是否检查过fp是否有效?它是如何打开的?你用"rb+"模式了吗?但是,主要问题可能是循环一次迭代结束时的fwrite()和下一次循环开始时的fread()之间缺少fseek()。当从阅读切换到写作(你会这样做)以及从写作切换到阅读(你不这样做)时,你必须做一个fseek()。这会导致不确定的行为,UB。 -
你
fflush(stdin)和读/寻求/写fp。是你想要的吗? -
表达式:
sizeof( int )如果底层硬件是 64 位将返回 8,如果底层硬件是 32 位则返回 4