无论我在fopen中使用哪种模式打开文件,fprintf均以文本格式写入数据

问题描述

尝试使用fprintf()以二进制模式存储int,但是无论我在fopen()中指定哪种模式,它都仅以文本格式写入int值。另一方面,当我使用fwrite代替fprintf时,它以二进制格式存储int。那么我们可以在二进制模式下使用fprintf吗?

#include <stdio.h>

int main()
{
    FILE *fp;
    fp = fopen("abc.bin","wb");
    int num = 69;
    fprintf(fp,"%d",num);
    fclose(fp);
    return 0;
}

此外,如果我们谈论其他I / O功能,那么哪些功能可以完美地与二进制模式配合使用?有关此类行为的任何正式记录吗?

我正在mingw下的Windows平台上工作。

解决方法

fprintf()用于将int参数转换为人类可读的格式。要将二进制数据存储到文件中,实际上必须使用"wb""ab"以二进制模式打开它,并且可以使用fwriteputc

int n = 1234;
if (fwrite(&n,sizeof(n),1,fp) == 1) {
    // n was successfully written to fp
}

fwrite使用正在运行的系统中使用的表示形式和字节顺序存储int值。如果可以将文件传输到其他系统以在此处读取,则必须指定文件中使用的字节顺序和表示形式,并以可移植的方式实现读写功能:

#include <stdio.h>
#include <stdint.h>

int write_int32_le(int n,FILE *fp) {
    /* write the int as a 4 byte little endian two's complement representation */
    uint32_t u32 = n;
    int res = 4;
    for (int i = 0; i < 4; i++) {
        if (putc(u32 & 255,fp) == EOF)
            res = EOF;
        u32 >>= 8;
    }
    return res;
}

int read_int32_le(FILE *fp) {
    /* write the int as a 4 byte little endian two's complement representation */
    uint32_t u32 = 0;
    for (int i = 0; i < 4; i++) {
        int c = getc(fp);
        if (c == EOF)
            return EOF;
        u32 |= (uint32_t)c << (i << 3);
    }
    return (int)u32;
}

您的二进制文件中也可以使用其他表示形式,例如big-endian或LEB128