You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50x WAV文件反转:fwrite是否自带fseek式指针移动功能?

关于fwrite文件指针移动的疑问

我正在完成CS50x中的WAV文件反转任务,需将现有WAV文件反转后生成新文件。目前已完成其他所有任务,但对fopen、fwrite和fseek的使用存在疑问。我编写了如下循环代码:

for (int i = 0; i < iterateCount; i++)
{
    fseek(input, -blockSize * (i + 1), SEEK_END);
    fseek(output, headerSize + blockSize * i, SEEK_SET);

    // copy & paste
    fread(&buffer, blockSize, 1, input);
    fwrite(&buffer, blockSize, 1, output);
}

这段代码运行正常,但查阅资料发现他人未对输出文件使用fseek。我原本以为若不定位输出文件,fwrite会重复写入同一位置,但移除输出文件的fseek后代码仍正常运行。因此想询问:fwrite自身是否具备类似fseek的文件指针移动功能?


答案:
fwrite确实会自动移动文件指针。每次调用fwrite成功写入数据后,文件指针会自动向后偏移,偏移的字节数等于实际写入的字节数——你这里每次固定写入blockSize字节,所以指针每次都会往后跳blockSize的长度。

你之前给输出文件加的fseek其实是多余操作:第一次写入后,指针已经处于headerSize + blockSize的位置,第二次写入时自然会定位到下一个block的位置,完全不需要手动调用fseek来指定。你的代码里,手动用fseek定位的位置和fwrite自动移动后的位置完全一致,所以去掉后代码依然能正常运行。

内容的提问来源于stack exchange,提问作者joeypaak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:00:11