从C中的标准输入阅读正好N个字节

xxhby3vn  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(87)

我必须从标准输入中读取正好4个字节,然后将其视为一个小字节序,并将其显示在标准输出上,但我不知道我读取的是否正好是4个字节。我尝试了以下方法:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <byteswap.h>

int main() {
   uint32_t f;

   printf("Enter a value :");
   scanf ("%" SCNu32, &f);
   printf("Value of integer:%d", f);
   //printf("Value of integer:%d", __bswap_32(f));

   return 0;
}

我不确定这是否正好读到4字节。我尝试了以下整数:

input->output
123->123
12345678->12345678
123456789->123456789
4294967295->-1
4294967294->-2
4294967296->-1
1->1

我认为打印f会像这样:1234000f=1234的值)或12345678f=123456789的值)。

9lowa7mx

9lowa7mx1#

要从stdin中读取4个字节,可以使用fread()getc()scanf()

  • 使用fread()
// return 1 on success, 0 on failure
int read32(uint32_t *f) {
    return fread(f, sizeof *f, 1, stdin) == 1;
}
  • 使用getchar()getc()
int read32(uint32_t *f) {
    char *p = (char *)f;
    for (size_t i = 0; i < sizeof(f); i++) {
        int c = getchar();  // or getc(stdin)
        if (c == EOF)
            return 0;
        p[i] = c;
    }
    return 0;
}
  • 使用scanf()
int read32(uint32_t *f) {
    char *p = (char *)f;
    return scanf("%c%c%c%c", p, p+1, p+2, p+3) == 4;
}

但是请注意,stdin默认以文本模式打开,这会导致遗留系统执行行尾转换,并且没有可移植的方式在开放流上更改此模式。
还要注意的是,上述函数假设当前主机使用与文件相同的小端排序。最好避免这种假设,并执行可移植转换:

// return 1 on success, 0 on failure
int read32(uint32_t *f, FILE *fp) {
    uint8_t a[4];
    if (fread(a, sizeof a, 1, fp) != 1)
        return 0;
    *f = ((uint32_t)a[0] <<  0) |
         ((uint32_t)a[1] <<  8) |
         ((uint32_t)a[2] << 16) |
         ((uint32_t)a[3] << 24);
    return 1;
}

相关问题