我有一些关于inttypes的问题,这里用这个小代码示例说明:
#include#include #include void print_byte(uint8_t b) { printf("%d%d%d%d%d%d%d%d\n", !!(b & 128), !!(b & 64), !!(b & 32), !!(b & 16), !!(b & 8), !!(b & 4), !!(b & 2), !!(b & 1)); } int main() { FILE *f; uint8_t bs = 8; uint16_t bw = 100, bh = 200; f = fopen("out", "w+"); print_byte(bs); printf("%"PRIu8" %"PRIu16" %"PRIu16"\n", bs, bw, bh); fprintf(f, "%"PRIu8"%"PRIu16"%"PRIu16, bs, bw, bh); fclose(f); f = fopen("out", "r"); fscanf(f, "%"SCNu8"%"SCNu16"%"SCNu16, &bs, &bw, &bh); printf("%"PRIu8" %"PRIu16" %"PRIu16"\n", bs, bw, bh); print_byte(bs); fclose(f); return 0; }
给我
gcc -o test test.c && ./test 00001000 8 100 200 104 100 200 01101000
如果我改变fscanf中的SCNu8
to SCNo8
,我会得到我应该得到的:
00001000 8 100 200 8 100 200 00001000
问题出在哪儿?我不明白为什么它对第一个代码不起作用,但是当我将该字节解释为八进制值时起作用.
问题是文本文件中的值最终被合并在一起,如下所示:
8100200
这就是为什么你不能正确读回数据的原因:fscanf
不知道第一个数字的结束位置和下一个数字的开始.
将空格放入fprintf
格式行可以解决此问题:
fprintf(f, "%"PRIu8" %"PRIu16" %"PRIu16, bs, bw, bh);
[
fscanf
应该读出的1个字节的值则2个2字节]
fscanf
读取文本,而不是字节.如果你想写入字节,使用二进制输出和输入,即库函数fwrite
和fread
:
// Writing in binary f = fopen("out.bin", "wb"); fwrite(&bs, sizeof(bs), 1, f); fwrite(&bw, sizeof(bw), 1, f); fwrite(&bh, sizeof(bh), 1, f); fclose(f); // Reading in binary f = fopen("out.bin", "rb"); fread(&bs, sizeof(bs), 1, f); fread(&bw, sizeof(bw), 1, f); fread(&bh, sizeof(bh), 1, f);