代码之家  ›  专栏  ›  技术社区  ›  Sefean

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

  •  1
  • Sefean  · 技术社区  · 5 年前

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

    file*f=fopen(“out/solution.raw”,“wb”);
    int i,j;
    /尺寸=512
    对于(i=0;i<size;i++)
    {
    fwrite(矩阵[i],1,大小,f);
    }
    
    F损失(F);
    

    问题是,当我打开文件时,它在数字之间是3'0',这里有两个截图来帮助你理解我的意思:

    这就是我应该得到的:

    这就是我得到的:

    如您所见,我的代码正确地写入了每个数字,但每个数字之间有三个0,我不知道为什么。

    我也试过这个:

    fwrite(matrix[i],sizeof(matrix[i][0]),size,f);
    < /代码> 
    
    

    但似乎没有任何效果,任何帮助都将得到极大的赞赏。


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

    matrix=(int**)malloc(size*sizeof(int*));
    对于(i=0;i<size;i++)
    {
    矩阵[i]=(int*)malloc(size*sizeof(int*);
    }
    < /代码> 
    
    

    我已经尝试过您的解决方案,但无法将未分类的char赋给int,因此我尝试了强制转换,并收到以下警告:

    从指针转换为不同大小的整数。

    unsigned char to_write;
    对于(i=0;i<size;i++)
    {
    写入=(无符号字符)矩阵[I];
    写入(写入,1,1,f);
    }
    < /代码> 
    
    

    (使用的代码)

    在那之后,我得到了:

    顺便说一句,我的数据没有签名。

    问题是,当我打开文件时,它在数字之间是3'0',这里有两个截图帮助您理解我的意思:

    这就是我应该得到的:

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

    我已经尝试过您的解决方案,但无法将非智能字符赋给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 回复  |  直到 5 年前
        1
  •  2
  •   Jean-François Fabre Darshan Ambre    5 年前

    matrix[i] 是32位整数上的指针。即使指定的值以8位为单位,也不会在写入二进制流时“压缩”数据(另外,可能不会写入512个值,但只有512/4=128个值)。

    您的机器是小endian,所以您首先得到LSB,然后为每个值得到3个零。

    所以改变 矩阵〔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。

    编辑:您的编辑显示 矩阵 . 矩阵〔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);
       }
    }