将2D数组写入C语言的二进制文件中(得到奇怪的结果)

时间:2018-11-24 17:36:08

标签: c io binaryfiles

我正在使用以下代码编写文件:

FILE *f = fopen("out/solution.raw", "wb");
int i, j;
//SIZE = 512
for(i = 0; i < SIZE; i++)
{
    fwrite(matrix[i], 1, SIZE, f);
}   

fclose(f);

问题是当我打开文件时,数字之间为3'0',以下是2个屏幕截图,可帮助您理解我的意思:

这就是我应该得到的:

This is what I should be getting:

这就是我得到的:

My output

您可以看到我的代码正确地写了每个数字,但是每个数字之间有三个0,我不知道为什么。

我也尝试过:

fwrite(matrix[i], sizeof(matrix[i][0]), SIZE, f);

但是似乎没有任何效果,任何帮助将不胜感激。


我的矩阵被声明为int的2D数组,因为我需要对这些数字进行一些操作:

matrix = (int**)malloc(SIZE * sizeof(int*));
for (i = 0; i < SIZE; i++)
{
    matrix [i] = (int*)malloc(SIZE * sizeof(int*));
}

我已经尝试了您的解决方案,但无法将一个未分配的char分配给一个int,所以我尝试了对其进行强制转换,并收到以下警告:

从指针投射到不同大小的整数。

unsigned char to_write;
for(i = 0; i < SIZE; i++)
{
    to_write = (unsigned char)matrix[i];
    fwrite(&to_write, 1, 1, f);
}   

(使用的代码)

之后,这就是我要得到的:

enter image description here

顺便说一句,我的数据是未签名的。

1 个答案:

答案 0 :(得分:2)

matrix[i]是32位整数的指针。即使您分配的值保持8位,在写入二进制流时也不会“压缩”数据(另外,您可能不会写入512个值,而只写入512/4 = 128个值)< / p>

您的机器是低位字节序,因此对于每个值,您首先获取LSB,然后获取3个零。

因此,根据需要,将matrix[i]的类型从int32_t *更改为char *unsigned char *,确保您的值在8位范围内,并且您可以按照您的计划使用fwrite

如果您无法更改matrix的数据类型,请使用循环来转换值

for(i = 0; i < SIZE; i++)
{
    uint8_t to_write = matrix[i];  // assign/truncate for 0/255 range
    fwrite(&to_write, 1, 1, f);
}   

如果您的数据已签名,则必须使用int8_t。但是在那种情况下,您将无法将a0写为160。

编辑:您的编辑显示的是matrix的真实类型。 matrix[i]是数据的指针,因此您需要使用双循环将其转储,否则您将复制数组的地址,而不是值

for(i = 0; i < SIZE; i++)
{
   const int *row = matrix[i];
   for(j = 0; j < SIZE; j++)
   {
       uint8_t to_write = row[j];  // assign/truncate for 0/255 range
       fwrite(&to_write, 1, 1, f);
   }
}