我正在使用以下代码编写文件:
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个屏幕截图,可帮助您理解我的意思:
这就是我应该得到的:
这就是我得到的:
您可以看到我的代码正确地写了每个数字,但是每个数字之间有三个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);
}
(使用的代码)
之后,这就是我要得到的:
顺便说一句,我的数据是未签名的。
答案 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);
}
}