- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在使用 inttypes 时遇到了一些问题,这里用这个小代码示例进行了说明:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
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
更改为 SCNo8
,我会得到我应该得到的结果:
00001000
8 100 200
8 100 200
00001000
问题出在哪里?我不明白为什么它对第一个代码不起作用,但当我将该字节解释为八进制值时起作用。
最佳答案
问题是您的文本 文件中的值最终会合并在一起,如下所示:
8100200
这就是您无法正确读回数据的原因:fscanf
不知道第一个数字在哪里结束以及下一个数字从哪里开始。
将空格放入 fprintf
格式行可解决此问题:
fprintf(f, "%"PRIu8" %"PRIu16" %"PRIu16, bs, bw, bh);
[
fscanf
is] supposed to read a 1 byte value then two 2 bytes
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);
关于c - 与 inttypes.h、fscanf()、fprintf() 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35381955/
nb:由于评论,这个问题已经被减少了很多次。下面列出了生成错误的最少量代码。 inttypes.h 文件是从这里下载的:ffMPEG "inttypes.h not found" error ),一开
我正在重写一些代码以与 32 位和 64 位架构兼容,但我在调用 vsnprintf 时遇到了问题。 vsnprintf 似乎没有在任一架构上正确处理来自 inttypes.h 的固定大小整数类型。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我正在尝试按照此处所示的 OpenGL 3D 教程进行操作: http://www.arcsynthesis.org/gltut/index.html 我已经按照为构建教程编写的说明进行操作,但是当我
我有一个 C 语言代码,我将在 PIC 微 Controller 上运行。我正在使用 Mplab IDE 8.92 和 Mplab C18 3.46。我以前从未使用过微 Controller 这样做过
我当前的代码库中有以下代码片段: // uint32_t id; defined somewhere bool msb_set = id & 0x80000000 并希望将其更改为更灵活的内容: us
我正在寻找任何 GCC/MinGW 大师。我尝试使用 MinGW 在 Windows 8.1 中安装一个库,并配置说 stdint.h 和 inttypes.h 丢失: $ ./configure c
我在使用 inttypes 时遇到了一些问题,这里用这个小代码示例进行了说明: #include #include #include void print_byte(uint8_t b) {
stdint.h 和 inttypes.h 有什么区别? 如果没有使用它们,则无法识别 uint64_t,但使用它们中的任何一个,它都是定义的类型。 最佳答案 标准输入.h 如果您想使用 C99 的指
在 Windows 中使用 Visual Studio 2010 中的 ffMPEG 构建时,我遇到了 inttypes.h not found 错误。 由于通过互联网搜索导致我找到错误的解决方案,我
据我了解,当用于提取随机数时,分布不应改变。例如,对于均匀分布,当我们使用它生成随机数时,它的最小值/最大值不应改变,那么为什么 operator()不是 const 吗? 最佳答案 虽然 min()
为什么是PRIx16 == "x" in C (和 in C++ )在 GCC 下? 我希望它是 "hx",以便以下工作: #include int16_t v = -1; printf("%04"
我正在使用 Borland C++ Builder,我写了一个类,因为我正在使用“int64_t”,所以我必须在其中使用这个头文件“inttype.h”。问题是我有这个错误告诉我它可以打开这个包含文件
我想在 Visual Studio 项目中使用 C99 头文件 inttypes.h(我想打印 64 位数字)。 但是,我的安装中似乎不存在此文件。 这不是 VS2005 的一部分吗?有其他选择吗?
当我这样做 #include long long value = 0; printf("An 8 byte long integer value: %"PRId64".", value); Ecli
#include #include int main(void) { int8_t int8; int16_t int16; int32_t int32; int6
在 C++11 中,我们提供了固定宽度的整数类型,例如 std::int32_t 和 std::int64_t,它们定义在 cstdint/类型。但是,int32_t 和 int64_t 也在 std
我正在开发一个 C++ 库,其中使用 SWIG 生成其 Python 包装器。我的一些 C++ 文件使用 在 sprintf 中调用 PRId64 和其他宏。 我能够在 Scientific Linu
我是一名优秀的程序员,十分优秀!