在C中写二进制文件

时间:2016-07-06 21:34:45

标签: c linux file binary writing

我意识到这个问题已经被问过了,我已经搜索了(大多数)文章,但我似乎无法用二进制文件写一个文件。我可以打开文件并以人类可读的格式编写,但我想要的是写入文件的非人类可读数据(如hex)。我知道Linux上的“xxd”命令,但是我想知道我怎么能用C模仿它。到目前为止我的相关代码如下(文件的打开后跟文件的写入:

extern FILE* file;
static char file_buffer[16384];
file = fopen("audit_log", "wb");

if ( !file )
{
    printf("failed to open file");
    exit(1);
}


if ( !fwrite( &file_buffer, 1, sizeof(file_buffer), file ) )
    printf("fwrite failed\n");

fclose(file)

我已经完成了我的研究和测试,并使用“b”参数与fwrite()配对使用fopen()的所有不同类型的模式,但这些方法都没有帮助我编写二进制文件到C.我错过了一些微不足道的东西吗?我似乎无法弄清楚为什么我不能用二进制文件写一个简单的文件。谢谢!

2 个答案:

答案 0 :(得分:1)

文件内容是一系列字节。现在,应用程序正在尝试读取一个文件,该文件根据这些字节的值来解释它的文件类型。

例如,如果您的文件包含其值均在可打印ASCII值范围内的字节,则应用程序会将该文件视为ASCII文件。

您可以将任何值写入文件中的字节。例如下面的程序:

/* main: write a new filej */
int main(void)
{
    unsigned char c;
    FILE *fp;

    /* open a file to write */
    fp = fopen("test_file", "w");
    if (fp == NULL) {
             printf("Open Error\n");
             return 1;
    }

    /* write some data to file  */
    for (c=0; c < 200; c++)
            fputc(c, fp);

    /* close file */
    fclose(fp);

    return 0;
}

将向test_file写入200个字节。在这200个字节中,有些字符是人类可读的,有些字符是非人类可读的,如下所示。

[05:52 PM] $ wc test_file 
1   1 200 test_file
[05:52 PM] $ cat test_file 
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~����������������������������������������������������������������������[05:52 PM] $ 

因此,您可以将任何内容写入文件。然后是读取文件的应用程序解释它的某种类型。例如,让我们在linux中使用file应用程序:

[05:55 PM] $ file test_file 
test_file: Targa image data - RGBA (1027-1541) 3340 x 3854 x 16 +2312 +2826 - 1-bit alpha - right
[05:55 PM]

file实用程序将此文件视为某个图像数据文件。

答案 1 :(得分:1)

你遇到的一个问题是你实际上没有在file_buffer中放入任何数据,所以你要写入文件的内容是随机垃圾。

你遇到的真正问题是:

if ( !fwrite( &file_buffer, 1, sizeof(file_buffer), file ) )

应该是:

if ( !fwrite( file_buffer, 1, sizeof(file_buffer), file ) )

你传入一个指向指针的指针,而不是指向char fwrite的简单指针。