我意识到这个问题已经被问过了,我已经搜索了(大多数)文章,但我似乎无法用二进制文件写一个文件。我可以打开文件并以人类可读的格式编写,但我想要的是写入文件的非人类可读数据(如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.我错过了一些微不足道的东西吗?我似乎无法弄清楚为什么我不能用二进制文件写一个简单的文件。谢谢!
答案 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的简单指针。