使用 scanf/printf 读写 bitset。

4

我对C++还比较陌生,想知道如何将scanf输入或printf输出到bitset中,即哪种类型说明符适合于bitset索引的I/O?以下是我想做的示例:

#include <bitset>
#include <stdio.h>

using namespace std; 

int main() 
{
    bitset<1> aoeu;
    scanf("%d" &bitset[0]); //this line
    printf("%d" bitset[0]); // this line
}

2
为什么?如果你正在使用C++,那就使用C++的特性(比如cin/cout)。你可以使用to_string然后打印出它的字符数组。 - ChrisMM
您不能直接使用 scanf 和位集(bitset)进行输入,因为 scanf 需要一个字节的地址而不是位(bit)。但是,您可以先使用 scanf 读取一个字节(unsigned char)或一个 int,然后将其转换为位集(bitset)。 - Andreas Wenzel
3个回答

3

正如ChrisMM所提到的那样,你应该使用C++的输入输出方式。幸运的是,std::bitset 重载了operator<<operator>>,因此你可以直接从std::cin读取并写入std::cout,而不需要使用to_string(),就像下面这样:

#include <bitset>
#include <iostream>
 
int main() 
{
    std::bitset<1> aoeu;
    std::cin >> aoeu; // read bitset from standard input
    std::cout << aoeu; // write bitset to standard output
}

如果你只想读取一个特定的位并将其放入bitset中,则必须进行更间接的处理:
std::bitset<3> bits;
int value;
std::cin >> value; // read one integer, assuming it will be 0 or 1
bits[1] = value; // store it in the second bit of the bitset

1
你没有回答 OP 的主要问题,即如何使用 scanfprintf 完成这个任务。鉴于 OP 的问题可能是一个 XY 问题,你向他展示了解决根本问题的正确方法,而不使用 scanfprintf。因此,我已经给你的回答点了赞。但为了完整起见,我自己也写了一篇答案,在其中回答了 OP 如何使用 scanfprintf 来完成任务的问题。 - Andreas Wenzel

3
你关于如何使用scanfprintf实现这一点的问题似乎是一个XY问题。@GSliepen提供的答案展示了如何在C++中正确地实现它。
然而,如果你真的想知道如何使用scanfprintf来完成此操作(我不建议这样做),我将直接回答你的问题:
你不能直接使用scanf来处理位集(bitsets),因为scanf需要至少一个字节的地址,而不是单个位(bit)。大多数平台上甚至不存在单个位(bit)的地址。但是,你可以先使用scanf将数据写入到临时字节(unsigned char)或int中,然后再将其转换为位(bit)用于位集(bitset),例如像这样:
#include <bitset>
#include <cstdio>
#include <cassert>

int main() 
{
    std::bitset<1> aoeu;
    int ret, input;

    ret = std::scanf( "%d", &input );
    assert( ret == 1 );

    aoeu[0] = input;

    std::printf( "%d\n", static_cast<int>(aoeu[0]) );
}

如果你想知道为什么我没有像你在问题中那样使用using namespace std;,那么你可能想阅读这个StackOverflow问题


0

打印特定位j的值:

printf("%d", aoeu(j));

要打印整个位集的值,建议使用:

printf("%s\n", val.to_string().c_str());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接