如何在C上将uint64_t字节保存到文件?

时间:2015-05-28 13:57:55

标签: c unix

如何在普通C上保存uint64_t bites文件?

我想输出文件的长度是8个字节?

3 个答案:

答案 0 :(得分:2)

fwrite(&sixty_four_bit_var, 8, 1, file_pointer)

答案 1 :(得分:1)

我建议将它作为字符串fprintf。更容易验证(cat或在文本编辑器中打开)并且没有带有endianess的hazzle。检查inttypes.h以获取正确的格式说明符(PRIu64)。

使用SCNu64作为格式说明符,使用fscanf进行回读。

如果数据类型未与第一个位置对齐,那也将有效。对于uint64_t而言,这是不可能的,考虑一个1字节的字符,但由于某种原因不能从偏移量0开始(例如,没有8位加载/存储的大端CPU)。标准允许这样做。

但是,如果您真的想获得8位值,请使用以下命令:

uint64_t value = input_value;
for ( size_t i = 0 ; i < 8 ; i++ ) {
    fputc(value & 0xFF), filep);
    value >>= 8;
}

这将以little-endian格式存储值。请注意,由于右移(但它很可能非常),因此无法保证这适用于签名。

对于更复杂的结构,您可以使用适当的格式,如JSON和库。

答案 2 :(得分:1)

编辑。由于我的编译器没有uint64_t,我已经展示了两种使用unsigned long long将64位值保存到文件的方法。第一个示例以(十六进制)文本格式写入,第二个以二进制形式写入。

请注意,unsigned long long在某些系统上可能超过64位。

#include <stdio.h>

int main(void) {

    FILE *fout;
    unsigned long long my64 = 0x1234567887654321;

    // store as text
    fout = fopen("myfile.txt", "wt");
    fprintf(fout, "%llX\n", my64);
    fclose(fout);    

    // store as bytes
    fout = fopen("myfile.bin", "wb");
    fwrite(&my64, sizeof(my64), 1, fout);
    fclose(fout);    

    return 0;
}

myfile.txt(hex dump)的内容

31 32 33 34  35 36 37 38  38 37 36 35  34 33 32 31  1234567887654321
0D 0A                                               ..

myfile.bin的内容(十六进制转储)(little-endian)

21 43 65 87  78 56 34 12                            !Ce‡xV4.