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

18

大家好,在我的项目中,我需要读取一个以short(16位值)格式存储传感器数据的.bin文件。我使用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()函数后(16进制值):

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

你尝试过关闭然后重新打开文件吗?如果你在写入文件后立即读取它,我不确定文件的内容是什么。你可能需要先关闭它以确保数据被刷新出来。此外,请确保第二次打开时将其用于读取... - aardvarkk
如果你要使用fread/fwrite读写文件,应该始终在文件模式中使用'b'。读取文本文件时,很容易出现错误或奇怪的行为。大多数实现都在fread/fwrite中进行文本转换,但正如我所说,这可能会导致问题(翻译后的CR/LF可能会导致写入更多数据或读取比预期少的数据)。使用fgets/fputs来读写文本文件。 - Tim Ring
2个回答

14

使用模式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

3

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

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

Should be:

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

2
模式 rwb 未被识别。我认为你的意思是 w+bwb+ - pmg
2
嗯,@Richard:它并不是标准的。在这里看或者在这个PDF文件中 - pmg
在Mac OS X下,fopen()函数中的'b'标志被忽略了,但在Microsoft的实现中不是这样。 - trojanfoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接