fwrite()在Unix中继续写00。可能出错的地方?

时间:2014-11-24 21:35:57

标签: c linux unix

我的部分代码如下:

for(i=0; i<16;i++){
    for(j=0;j<16;j++){
        printf(" %d ", microBlock[i][j]);   // everything looks ok from the console
    }
    printf("\n");
}
for(i=0; i<16;i++)
    for(j=0;j<16;j++){
        fwrite(&microBlock[i][j], 1, 1, output);  //each value is smaller than 255
                                        //only want to write 1 byte for each value. 
                                        // For example, ff for value 255
    }

我想将16 x 16数组(所有值为Integer且小于255)的值写出到文件中。但是它继续写文件而不是Unix下的数组中的值(在我的Linux机器上运行,但是当我使用Unix上传到实验室机器之一时,输出文件只填充了00s)有谁知道我的代码可能出错了?感谢。

PS:我知道Unix和Linux可能存在一些差异,但我的代码非常简单。这真的很重要吗?

2 个答案:

答案 0 :(得分:2)

int的大小肯定不是1.使用正确的大小:

fwrite(&microBlock[i][j], sizeof( microBlock[i][j] ), 1, output);

答案 1 :(得分:2)

鉴于你有:

int microBlock[16][16];

并且填充了0x00..0xFF范围内的值,并且您只想为文件中的每个值写一个字节,然后您需要执行以下两项操作之一:

选项1 - 一次写入一个字节

for (int i = 0; i < 16; i++)
{
    for (int j = 0; j < 16; j++)
    {
        char byte = microBlock[i][j];
        if (fwrite(&byte), 1, 1, output) != 1)
            ...write failed...
    }
}

选项2 - 一次写入所有字节

char nanoBlock[16][16];
for (int i = 0; i < 16; i++)
    for (int j = 0; j < 16; j++)
        nanoBlock[i][j] = microBlock[i][j];

if (fwrite(nanoBlock, sizeof(nanoBlock), 1, output) != 1)
    ...write failed...

要么工作;第二个可能更有效率,因为它只调用fwrite(),但它不是绝对的。