Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用std::vector进行文件I/O<;bool>;?_C++_Boolean_Bit Manipulation - Fatal编程技术网

C++ 如何使用std::vector进行文件I/O<;bool>;?

C++ 如何使用std::vector进行文件I/O<;bool>;?,c++,boolean,bit-manipulation,C++,Boolean,Bit Manipulation,我需要实现一个布尔数据容器,它将存储相当多的变量。我想我可以只使用char*并实现C风格的宏访问器,但我更喜欢将其包装在std::结构中标准::位集似乎不实用,因为它在编译期间具有固定的大小 这就给我留下了std::vector,它针对空间进行了优化;它有一个漂亮的布尔式存取器 有没有一种方法可以直接将指针从它馈送到fwrite() 如何将文件输入到这样的向量中 最后,当需要大量的文件I/O时,它是一个好的数据结构吗 那么随机文件访问(fseeketc)呢 编辑:我决定将一个std::vecto

我需要实现一个布尔数据容器,它将存储相当多的变量。我想我可以只使用
char*
并实现C风格的宏访问器,但我更喜欢将其包装在
std::
结构中<代码>标准::位集似乎不实用,因为它在编译期间具有固定的大小

这就给我留下了
std::vector
,它针对空间进行了优化;它有一个漂亮的布尔式存取器

  • 有没有一种方法可以直接将指针从它馈送到
    fwrite()

  • 如何将文件输入到这样的向量中

  • 最后,当需要大量的文件I/O时,它是一个好的数据结构吗

  • 那么随机文件访问(
    fseek
    etc)呢


  • 编辑:我决定将一个
    std::vector
    封装在一个新类中,该类具有我的需求所需的功能。

    您可以使用一个
    std::vector
    ,将其大小调整为文件大小(或者其他大小,比如您希望处理固定长度的块),然后您可以将其内容传递给一个类似
    fread()的函数
    fwrite()
    按以下方式:

    std::vector<char> fileContents;
    fileContents.resize(100);
    fread(&fileContents[0], 1, 100, theFileStream);
    
    std::向量文件内容;
    fileContents.resize(100);
    fread(&fileContents[0],1100,文件流);
    
    <>这只允许你用C++风格有一个可调整的字符数组。也许这是一个有用的起点?关键是,您可以直接访问向量后面的内存,因为它保证按顺序排列,就像数组一样

    同样的概念也适用于
    std::vector
    ——我只是在
    fread
    的时候要小心,因为我无法告诉你
    bool
    有多大(
    sizeof
    wise),因为它取决于平台(8位vs 16位vs 32位,如果你在微控制器上工作的话)

    似乎可以优化
    std::vector
    以将每个bool存储在一个位中,因此,除非您知道它会工作,否则绝对不要尝试直接使用
    vector
    后面的内存

    • 是否有一种方法可以直接将指针从它馈送到fwrite()
    不可以,但您可以使用
    std::fstream

    std::ofstream f("output.file");
    std::copy(vb.begin(), vb.end(), std::ostream_iterator<bool>(f, " "));
    
    std::ifstream f("input.file");
    std::copy(std::istream_iterator<bool>(f), {}, std::back_inserter(vb));
    
    • 最后,当需要大量的文件I/O时,它是一个好的数据结构吗
    不,
    vector
    对于任何目的来说都很少是一个好的数据结构。看

    • 那么随机文件访问(fseek等)呢

    怎么办?

    这是个好主意-但我没有部署boost,我不确定这样做的成本是否会带来好处。这是vector的一个专门版本,用于bool类型的元素并优化空间。-然而,在下一个公告点上,它指出了“可能”一词,这可能意味着未定义的行为..哇,我不知道STL中的这种优化。。。那我就不用了。对我来说,使用
    std::vector
    。除非你处理的是GB大小的文件,否则我认为你应该没问题,当然这取决于很多因素,不是吗?不过,你可以使用
    向量
    并使用循环填充它。这不会比使用
    fread
    的效率低,后者可能也会使用循环(我的意思是它可能会使用一些魔法,比如共享内存页或虚拟内存或其他类似的东西,但实际上我认为它只会复制仍然是O(n)的内存)@WayneUroda事实上,这种想要的优化是标准库中最大和最古老的设计缺陷之一(这正是您提出的
    std::vector
    在文件I/O(以及许多其他方面)方面远远优于标准库的原因)。