从istreambuf_iterator构造时无法获得矢量大小

时间:2017-02-09 11:59:00

标签: c++ vector

我正在尝试读取一个充满std::complex<float>的二进制文件。我尝试了以下代码EntityTypeConfiguration

#include <complex>
#include <iostream>
#include <iterator>
#include <fstream>
#include <string>
#include <vector>


void readRawFile(const std::string inputFile){
    std::ifstream input(inputFile, std::ios::binary);
    std::vector<std::complex<float>> auxBuffer(std::istreambuf_iterator<std::complex<float>>(input), std::istreambuf_iterator<std::complex<float>>());
    std::cout << "Number of raw samples read: " << auxBuffer.size();
}

int main(){
    readRawFile("myRawFile.raw");
    return 0;
}

我收到以下编译错误:

In function 'void readRawFile(std::string)': 12:59: error: request for member 'size' in 'auxBuffer', which is of non-class type 'std::vector<std::complex<float> >(std::istreambuf_iterator<std::complex<float> >, std::istreambuf_iterator<std::complex<float> > (*)())'

我不明白为什么我不能访问我刚创建的矢量的大小方法而没有编译错误。我想它与矢量的创建方式有关,但我觉得它并没有给出错误。

对此有何解释?

2 个答案:

答案 0 :(得分:4)

您复制的答案显示了如何将流中的原始字符读入缓冲区。这是istreambuf_iterator的正确用法。

您正尝试从流中提取复数。这是一个完全不同的操作,包括读取字符然后使用operator<< 解析它们。这不是istreambuf_iterator的用途。类型istreambuf_iterator<complex<float>>会尝试从complex<float>中提取basic_streambuf<complex<float>>类型的字符,这是无意义的。这不是一个字符类型,你不能将包含复数的streambuf作为原始字符。

istreambuf_iterator用于读取streambuf中的单个字符,而不是用于解析字符并将其解释为(复数)数字或其他类型。

您需要使用std::istream_iterator<X>从istream中提取X值,因此在修复最令人烦恼的解析后,您需要使用std::istream_iterator<std::complex<float>>作为迭代器类型。

答案 1 :(得分:2)

你已经点击了C ++的 Most Vexing Parse 。您的声明被解释为函数声明:

你可以:

void readRawFile(const std::string inputFile){
    std::ifstream input(inputFile, std::ios::binary);

    auto start = std::istream_iterator<std::complex<float>>(input);
    auto stop = std::istream_iterator<std::complex<float>>();

    std::vector<std::complex<float>> auxBuffer(start, stop);
    std::cout << "Number of raw samples read: " << auxBuffer.size();
}

或使用Uniform Brace Initialization(C ++ 11):

void readRawFile(const std::string inputFile){
    std::ifstream input(inputFile, std::ios::binary);
    std::vector<std::complex<float>> auxBuffer{std::istream_iterator<std::complex<float>>(input), std::istream_iterator<std::complex<float>>()};
    std::cout << "Number of raw samples read: " << auxBuffer.size();
}

直播Here