繁体   English   中英

尝试从ifstream :: read()切换到std :: copy()

[英]Trying to switch from ifstream::read() to std::copy()

到目前为止,这是我尝试过的方法,根本没有填充此向量:

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

int main()
{
    std::ifstream file("E:\\test3.wav", std::ios::binary );

    if( file.fail() )
    {
        std::cout << "File does not exist or could not open file";
    }
    else
    {
        std::vector<short> buffer;

        //read
        std::copy(
                    std::istream_iterator<short>( file ),
                    std::istream_iterator<short>(),
                    std::back_inserter( buffer )
                    );

        //size outputs to 0
        std::cout << buffer.size();
    }

    return 0;
}

但是,以下代码在else子句中使用read()可以正常工作:

std::vector<short> buffer( 56 );

    //read
    file.read( (char *) &buffer[0], 56 );

    //outputs the whole file with all expected values showing.
    std::copy( 
                 buffer.begin(), 
                 buffer.end(), 
                 std::ostream_iterator< short >( std::cout, " " )
             );

我缺少让std::copy()填充矢量的东西吗,如第一段代码所示?

istream_iterator使用istream上的operator >>重载进行读取; 格式化输入,而在此示例中:

std::vector<short> buffer( 56 );

//read
file.read( (char *) &buffer[0], 56 );

您正在读取原始字节。 (并且您没有填充56 short s,而是填充了56/sizeof(short) short s。)

看起来您会更喜欢istreambuf_iterator

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM