在二进制模式下写入不写入正确数量的字节

时间:2017-08-17 02:21:49

标签: c

我无法理解以下代码片段的fread fwrite行为,例如代码很简单:

#include <stdio.h>
int main(void)
{
    FILE *fp;
    int   arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int   temp[100] = {0};
    int   i;

    fp = fopen("testdata.bin","wb");
    if( fp!= NULL ) {
        fwrite( arr,sizeof(int), 10, fp);
        fclose(fp);
    }
    fp = fopen("testdata.bin","rb");
    if( fp!= NULL ) {
        fread( temp,sizeof(int), 10, fp);
        fclose(fp);
    }
    for(i=0;i<100;i++)
        printf("%#x,",temp[i]);
    printf("\b \n");
    return 0;
}

stdout上的输出是:

0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

这是有道理的。但是,当我打开testdata.bin文件时,我只看到两个字节的值(int),我希望4个字节,因为int的大小在我的机器上是4。

以下是testdata.bin的内容:

0x00000001: 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00
0x00000010: 09 00 0a 00 

我原本预计

0x00000001: 01 00 00 00 02 00 00 00 03 00 00 00 ...

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为fwrite工作正常。更改temp的声明,以便类型是一个单字节无符号字符的数组:

unsigned char temp [100] = {0} ;

当前版本的代码每次在print语句中显示一个四字节整数。这将确认文件的内容符合您的预期。在我的机器上:

0x1,0,0,0,0x2,0,0,0,0x3,0,0,0,0x4,0,0,0,0x5,0,0,0,0x6,0,0,0,0x7,0,0,0,0x8,0,0,0,0x9,0,0,0,0xa,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
相关问题