[英]Why do I have some trouble with fwrite() and fread()?
这是我的程序:
#include <iostream>
int main()
{
// open file1.txt
FILE* file1;
fopen_s(&file1, "file1.txt", "wb+");
// write array of 5 integers to file.txt
int array1[5] { 1, 2, 3, 4, 5 };
for (int i = 0; i < 5; i++)
{
fwrite(array1, sizeof(array1[0]), 5, file1);
}
fseek(file1, 0, SEEK_SET);
int tempValue;
fread(&tempValue, sizeof(tempValue), 1, file1);
// fseek(file1, 0, SEEK_CUR);
fwrite(&tempValue, sizeof(tempValue), 1, file1);
}
在运行时,程序崩溃并显示以下信息:
> Expression ("Flush between consecutive read and write.",
> !stream.has_any_of(_IOREAD))
但是如果我取消注释fseek(file1, 0, SEEK_CUR);
考虑到文件指针没有被移动,一切都会好起来的。 那为什么呢? 我使用 Visual Studio 2019
PS为什么这工作得很好?
#include <iostream>
int main()
{
FILE* file1;
fopen_s(&file1, "data.txt", "wb+");
int value = 7;
fwrite(&value, sizeof(value), 1, file1);
fwrite(&value, sizeof(value), 1, file1);
fseek(file1, 0, SEEK_CUR);
fwrite(&value, sizeof(value), 1, file1);
fread(&value, sizeof(value), 1, file1);
}
从微软 C 运行时库文档中提取
当指定“r+”、“w+”或“a+”访问类型时,允许读取和写入。 (据说该文件是为“更新”而打开的。)但是,当您从读取切换到写入时,输入操作必须遇到 EOF 标记。 如果没有 EOF,则必须使用对文件定位 function 的干预调用。 文件定位函数是 fsetpos、fseek 和 rewind。 当您从写入切换到读取时,您必须使用对 fflush 或文件定位 function 的干预调用。
在读/写操作之间进行更改需要文件位置 function,在您的代码片段中,您有:
...
fseek(file1, 0, SEEK_SET);
int tempValue;
fread(&tempValue, sizeof(tempValue), 1, file1);
// fseek(file1, 0, SEEK_CUR);
fwrite(&tempValue, sizeof(tempValue), 1, file1);
...
由于您正在从读取更改为写入,因此您需要调用文件位置 function(fsetpos、fseek 或 rewind)。
至于从写入到读取,您仍然需要调用文件位置 function。 然而,要回答为什么第二个代码块有效,我们需要知道 fwrite() 在成功时做了什么。
... fwrite function 从缓冲区到 output stream 写入最多计数项,每个大小长度。 与 stream(如果有)关联的文件指针会增加实际写入的字节数。
考虑您提供的代码:
...
FILE* file1;
fopen_s(&file1, "data.txt", "wb+");
int value = 7;
fwrite(&value, sizeof(value), 1, file1);
fwrite(&value, sizeof(value), 1, file1);
fseek(file1, 0, SEEK_CUR);
fwrite(&value, sizeof(value), 1, file1);
fread(&value, sizeof(value), 1, file1);
...
假设所有 fwrite() 都成功,您的文件指针将位于 EOF。 由于输入操作遇到 EOF ,代码块将执行得很好。
但是,如果 fwrite 失败,您应该遵循指南并调用 fsetpos、fseek 或 rewind。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.