使用fwrite直接复制文件数据失败,改用fread中转正常的原因咨询
问题原因解析
错误代码的核心问题
你最初的代码完全用错了fwrite的参数:
fwrite(image, sizeof(BYTE), 512, new_image); fseek(image, 512, SEEK_CUR);
fwrite的第一个参数要求是存储待写入数据的内存缓冲区指针,但你直接传了FILE*类型的文件指针image。这个指针指向的是C标准库内部维护的文件控制结构体,根本不是源文件内容的内存地址,所以fwrite会把结构体里的随机乱码写到目标文件,和源文件内容毫无关系。
哪怕调用fseek移动了源文件的读写位置,也解决不了fwrite参数错误的本质问题——它从始至终都不会去读取源文件的内容。
正确代码的逻辑
改成先读缓冲区再写入的代码,才符合文件IO的正确流程:
fread(example, sizeof(BYTE), 512, image); fwrite(example, sizeof(BYTE), 512, new_image);
fread会从image指向的源文件当前位置,读取512字节内容到example数组这个内存缓冲区;- 接着
fwrite把缓冲区example里的有效数据,写入到new_image指向的目标文件中。
整个过程完成了「源文件内容→内存缓冲区→目标文件」的正确数据流转,自然能正常工作。
内容的提问来源于stack exchange,提问作者Роман Кирьянов
相关产品推荐
相关产品推荐

