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
相关产品推荐
相关产品推荐

