将位集写入文件时出错

Bug with writing bitset to file

本文关键字:文件 出错      更新时间:2023-10-16

我有这个函数用于压缩任务(2天前到期,我只是想找出出了什么问题(。

它应该打印出来以标准输出输出或将其写入文件。标准输出是 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 ) ;
            }
        }
    }
}
file.write( reinterpret_cast<const char*>( &i ), 8 ) ;

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

撇开你的来源的所有其他问题(你也许应该去 codereview.SE(,这应该是一个1,而不是一个8

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


你没有给我们看呼叫代码。但是通过一个简单的调整,你可以使(据报道功能齐全的(std::cout代码也适用于文件 - 通过将std::ostream &而不是文件名传递给函数,并将其留给调用者是使用 std::cout 调用writer()还是打开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 );