如何在普通C上保存uint64_t bites文件?
我想输出文件的长度是8个字节?
答案 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.