70179


C++での実装を教えてください．  
引数は1バイトを16進数2桁で表したA3などの文字列を与えたいです．


CC BY-SA 4.0
2020-09-06T01:46:20.217
70177
2020-09-06T11:44:48.920
39562
question
c++ バイナリファイル
バイナリファイルから引数に指定した1バイトに該当するバイトをすべて削除する


> バイナリファイルから引数に指定した1バイトに該当するバイトをすべて削除する

「引数に指定」をコマンドラインからの指定と理解したサンプルです。

[code]

    #include <fstream>
    #include <iostream>
    #include <sstream>
    #include <algorithm>
    #include <iterator>
    
    bool fcopyExceptChar(const char* pi, const char* po, char dch)
    {
        std::ifstream ifs(pi, std::ios::in | std::ios::binary);
        std::ofstream ofs(po, std::ios::out | std::ios::binary);
        if (ifs && ofs) {
            std::copy_if(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>(),
                std::ostream_iterator<char>(ofs), [&dch](char ch) { return ch != dch; });
        }
        return !ifs.fail() && ofs;
    }
    
    int main(int argc, char* argv[])
    {
        if (argc != 4) {
            std::cerr << "Usage: " << argv[0] << " infile outfile except_byte" << std::endl;
            return EXIT_FAILURE;
        }
        std::istringstream iss(argv[3]);
        unsigned dch = 0;
        iss >> std::hex >> dch;
        std::cout << "delbyte " << argv[1] << " to " << argv[2] << " except " << argv[3] << " ... " << std::flush;
        if (!fcopyExceptChar(argv[1], argv[2], dch)) {
            std::cerr << "\nError delbyte " << argv[1] << " to " << argv[2] << " except " << argv[3] << std::endl;
            return EXIT_FAILURE;
        }
        std::cout << "done!" << std::endl;
        return EXIT_SUCCESS;
    }
    
[/code]

コードを改善しました。  
無駄なキャプチャーをなくし [&] を [&dch] へ  
変数名 os を iss へ改善しました。


CC BY-SA 4.0
2020-09-06T04:32:15.517
70179
2020-09-06T11:44:48.920
2020-09-06T11:44:48.920
41756
41756
70177
answer