【问题标题】:writing binary file in C用C写二进制文件
【发布时间】:2016-11-09 02:30:24
【问题描述】:

我意识到这个问题已经被问了很多次,并且我已经搜索了(大多数)文章,但我似乎无法用二进制文件编写文件。我可以打开文件并以人类可读的格式写入,但我想要的是写入文件的非人类可读数据(如十六进制)。我知道 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”参数为 fopen() 使用了所有不同类型的模式,并与 fwrite() 配对,但是这些方法都没有帮助我将二进制文件写入C. 我错过了一些微不足道的事情吗?我似乎无法弄清楚为什么我不能用二进制编写一个简单的文件。谢谢!

【问题讨论】:

  • fclose(file);,然后是 fwrite,现在已经失效的 FILE* file 不是一个好计划。发布显示您的问题的最少、真实和完整代码。如果您的问题中的代码无法剪切/粘贴到文本文件、编译、链接和运行以重现您的症状,那么这还不够。
  • ...loop() 是做什么的?
  • “编写二进制文件”是什么意思?就 C 而言,这只是意味着“不要添加任何额外的行终止字符”,我怀疑您希望数据以某种方式进行转换。听起来您实际上想要文件的十六进制转储
  • 基本上你总是在 unix 中编写二进制文件。其他一些环境基于 MS-DOS 传统换行符是两个字符这一事实来区分文本文件和二进制文件,并且玩游戏以将换行符变为回车符+换行符.. Linux 不是其中之一跨度>
  • if (!fwrite(...)) 不是对fwrite() 故障的完整检测。

标签: c linux file binary writing


【解决方案1】:

您遇到的一个问题是您实际上并未将任何数据放入您的 file_buffer,因此您写入文件的内容是在内存中发现的随机垃圾。

你遇到的真正问题是:

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

应该是:

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

您正在传递一个指向指针的指针,而不是预期的指向 char fwrite 的简单指针。

【讨论】:

  • 我很抱歉没有包含我的所有代码。我实际上确实填充了 file_buffer,我只是没有在这里显示它,因为该部分工作正常(并且很可能与我手头的问题无关)。我也做了你建议的更正,但输出文件是一样的。
  • 尝试使用 perror() 然后从 fwrite 失败中获取人类可读的错误消息。
【解决方案2】:

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

例如,如果您的文件包含值都在可打印 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] $ 

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

[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 实用程序将此文件视为某些图像数据文件。

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2019-09-18
    • 1970-01-01
    相关资源
    最近更新 更多