gpt4 book ai didi

c - 用 C 将二维数组写入二进制文件(得到奇怪的结果)

转载 作者:太空宇宙 更新时间:2023-11-04 02:24:19 24 4
gpt4 key购买 nike

我正在使用这段代码来编写文件:

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);

但似乎都不起作用,我们将不胜感激任何帮助。


我的矩阵被声明为一个二维整数数组,因为我需要对这些数字进行一些操作:

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

我已经尝试过您的解决方案,但我无法将 unsiged 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

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

最佳答案

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

你的机器是小端,所以你首先得到 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[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 将二维数组写入二进制文件(得到奇怪的结果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53460756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com