将bitset写入文件的错误

时间:2017-03-27 12:28:06

标签: c++ debugging binaryfiles

我有这个功能用于压缩分配(2天前,我只是想找出问题所在。)

应该打印出stdout输出或将其写入文件。 标准输出是100%准确的。

然而,二进制写入总是会产生垃圾。例如。它应该是23字节的输出,但总是16字节,并不是它应该是什么样的。我已经盯着这看了2个小时,有人能提供一个关于什么是错的提示吗?

非常感谢你。

void writer(char character, int count,std::string outputpath){
    if(outputpath == "cout"){
        switch(count){
            case 1:{
                std::cout << character;
                break;
            }
            case 2:{
                std::cout << character<< character;
                break;
            }
            default:{
                std::cout << character;
                auto output = conversion(count);
                for(auto i: *output){
                    std::cout << i;
                }
            }
        }
    }else{

        std::vector<std::bitset<8>> source;
        std::bitset<8>temp(character);
        switch(count){
            case 1:{
                source.push_back(temp);
                break;
            }
            case 2:{
                source.push_back(temp);
                source.push_back(temp);
                break;
            }
            default:{
                source.push_back(temp);
                auto output = conversion(count);
                for(auto i: *output){
                    source.push_back(i);
                }
            }
        }

        //write
        {
            std::ofstream file( outputpath, std::ios::binary ) ; // output file stream

            // write the contents of the vector to the file
            for( auto i : source ){
                file.write( reinterpret_cast<const char*>( &i ), 8 ) ;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

file.write( reinterpret_cast<const char*>( &i ), 8 ) ;

write()的第二个参数是将要写入的字符的数量。 &i是8 位集的位置。

除了您的源代码的所有其他问题(您应该转到codereview.SE),应该是1,而不是8

此外,在每次调用writer()时,您重新打开输出文件,在此过程中覆盖其内容。

您没有向我们展示调用代码。但是通过一个简单的调整,您可以通过将std::cout而不是文件名传递给函数,使(通常功能齐全的)std::ostream &代码也能用于文件,并将其留给调用者是使用writer()调用std::cout还是打开outputpath

void writer( char character, int count, std::ostream & out )
{
    switch( count )
    {
        case 1:
        {
            out << character;
            break;
        }
        case 2:
        {
            out << character << character;
            break;
        }
        default:
        {
            out << character;
            auto output = conversion( count );
            for ( auto i: *output )
            {
                out << i;
            }
        }
    }
}

呼叫std::cout输出:

writer( character, count, std::cout );

调用文件输出:

std::ofstream file( outputpath, std::ios::binary );
// ...
writer( character, count, file );