当前位置:  开发笔记 > 编程语言 > 正文

与inttypes.h,fscanf(),fprintf()不一致

如何解决《与inttypes.h,fscanf(),fprintf()不一致》经验,为你挑选了1个好方法。

我有一些关于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中的SCNu8to SCNo8,我会得到我应该得到的:

00001000
8 100 200
8 100 200
00001000

问题出在哪儿?我不明白为什么它对第一个代码不起作用,但是当我将该字节解释为八进制值时起作用.



1> dasblinkenli..:

问题是文本文件中的值最终被合并在一起,如下所示:

8100200

这就是为什么你不能正确读回数据的原因:fscanf不知道第一个数字的结束位置和下一个数字的开始.

将空格放入fprintf格式行可以解决此问题:

fprintf(f, "%"PRIu8" %"PRIu16" %"PRIu16, bs, bw, bh);

[ fscanf应该读出的1个字节的值则2个2字节]

fscanf读取文本,而不是字节.如果你想写入字节,使用二进制输出和输入,即库函数fwritefread:

// 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);

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有