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

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',这里有两个屏幕截图帮助您理解我的意思:
这就是我应该得到的:
c - 用C将2D数组写入二进制文件(得到奇怪的结果)-LMLPHP
这就是我得到的:
c - 用C将2D数组写入二进制文件(得到奇怪的结果)-LMLPHP
正如你所看到的,我的代码正确地写出了每个数字,但是每个数字之间有3个0,我不知道为什么。
我也试过:
fwrite(matrix[i], sizeof(matrix[i][0]), SIZE, f);

但似乎都没用,任何帮助都会非常感谢。
我的矩阵被声明为整数的二维数组,因为我需要对这些数字执行一些操作:
matrix = (int**)malloc(SIZE * sizeof(int*));
for (i = 0; i < SIZE; i++)
{
    matrix [i] = (int*)malloc(SIZE * sizeof(int*));
}

我已经尝试过你的解决方案,但是我不能为int分配一个未经识别的char,所以我尝试了对它进行强制转换,得到了以下警告:
从指针转换为不同大小的整数。
unsigned char to_write;
for(i = 0; i < SIZE; i++)
{
    to_write = (unsigned char)matrix[i];
    fwrite(&to_write, 1, 1, f);
}

(使用的代码)
在那之后我得到的是:
c - 用C将2D数组写入二进制文件(得到奇怪的结果)-LMLPHP
顺便说一下,我的数据是无符号的。

最佳答案

matrix[i]是32位整数上的指针。即使您分配的值保持在8位,当您写入二进制流时,也不会“压缩”数据(另外,您可能不会写入512个值,但只有512/4=128个值)
你的机器是小endian,所以你先得到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);
   }
}

关于c - 用C将2D数组写入二进制文件(得到奇怪的结果),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53460756/

10-13 06:41