如何使用 fread 和 fwrite 函数读写二进制文件?

Posted

技术标签:

【中文标题】如何使用 fread 和 fwrite 函数读写二进制文件?【英文标题】:How to use fread and fwrite functions to read and write Binary files? 【发布时间】:2012-02-29 02:27:18 【问题描述】:

您好,在我的项目中,我需要读取一个 .bin 文件,其中包含 short(16 bit values) 形式的传感器数据。我正在使用fread 函数到缓冲区中执行此操作,但我觉得读入没有正确发生。我的意思是我写的和读到的不一致。你们能建议这里出了什么问题吗?这不是我项目中的代码...我只是想验证freadfwrite 函数。

#include<stdio.h>
void main()

    FILE *fp = NULL;

    short x[10] = 1,2,3,4,5,6,5000,6,-10,11;
    short result[10];

    fp=fopen("c:\\temp.bin", "wb");

    if(fp != NULL)
    
        fwrite(x, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
        rewind(fp);
        fread(result, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
    
    else
        exit(0);

    printf("\nResult");
    printf("\n%d",result[0]);
    printf("\n%d",result[1]);
    printf("\n%d",result[2]);
    printf("\n%d",result[3]);
    printf("\n%d",result[4]);
    printf("\n%d",result[5]);
    printf("\n%d",result[6]);
    printf("\n%d",result[7]);
    printf("\n%d",result[8]);
    printf("\n%d",result[9]);

    fclose(fp)
 

在我执行 fread()(十六进制值)之后:

temp.bin:
01 02 03 04 05 06 e1 8e 88 06 ef bf b6 0b...

在我执行 fwrite() 之后

stdout:
Result
0
914
-28
-28714
-32557
1
512
-32557
908
914

【问题讨论】:

您是否尝试过关闭然后重新打开文件?如果您写入文件然后立即读取文件,我不确定文件的内容是什么。您可能必须先关闭它以确保数据被清除?另外,请确保您打开它以第二次阅读... 如果你要使用 fread/fwrite,真的应该在文件模式下使用 'b'。阅读文本文件时有很多搞砸或奇怪行为的机会。大多数实现都在 fread/fwrite 中进行文本翻译,但正如我所说,这可能会导致问题(翻译后的 CR/LF 可能导致写入的数据比预期的多或读取的数据少)。使用 fgets/fputs 读取/写入文本文件。 【参考方案1】:

使用模式w+(读写)打开文件。以下代码有效:

#include<stdio.h>
int main()

    FILE *fp = NULL;

    short x[10] = 1,2,3,4,5,6,5000,6,-10,11;
    short result[10];
    int i;

    fp=fopen("temp.bin", "w+");

    if(fp != NULL)
    
        fwrite(x, sizeof(short), 10 /*20/2*/, fp);
        rewind(fp);
        fread(result, sizeof(short), 10 /*20/2*/, fp);
    
    else
        return 1;

    printf("Result\n");
    for (i = 0; i < 10; i++)
        printf("%d = %d\n", i, (int)result[i]);

    fclose(fp);
    return 0;

有输出:

Result
0 = 1
1 = 2
2 = 3
3 = 4
4 = 5
5 = 6
6 = 5000
7 = 6
8 = -10
9 = 11

【讨论】:

【参考方案2】:

当您打开文件时,您忘记允许读取:

fp=fopen("c:\\temp.bin", "wb");

应该是:

fp=fopen("c:\\temp.bin", "w+b");

【讨论】:

无法识别模式rwb。我想你的意思是w+bwb+ 好吧@Richard:但它不是标准的。 see here 或 in this PDF. 在 Mac OS X 下 fopen() 中忽略了 'b' 标志,但在 Microsoft 的实现下没有。

以上是关于如何使用 fread 和 fwrite 函数读写二进制文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用fread函数循环读取二进制文件

fread函数和fwrite函数

C 语言文件操作 ( fwrite 函数 )

C 语言文件操作 ( fread 函数 )

fread和fwrite的使用

c语言中fgets 、fputs、fread、fscanf、fseek的区别和作用