我正在使用此代码编写文件:
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',这里有两个屏幕截图帮助您理解我的意思:
这就是我应该得到的:
这就是我得到的:
正如你所看到的,我的代码正确地写出了每个数字,但是每个数字之间有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);
}
(使用的代码)
在那之后我得到的是:
顺便说一下,我的数据是无符号的。
最佳答案
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/