繁体   English   中英

为什么我在使用 fwrite() 和 fread() 时遇到问题?

[英]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() 在成功时做了什么。

根据相同的 Microsoft 文档

... 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。


类似的 Stackoverflow 问题

C标准库角案例

为什么在更新模式的读写之间总是需要 fseek 或 fflush?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM