3

プレーン テキスト ヘッダーとそれに続くバイナリ イメージ情報を含むイメージ ファイルからヘッダーを削除しようとしています。これの前兆として、編集のためにファイル情報を文字列ストリームにコピーしたいと思います。これを行っているときに、いくつかの問題に遭遇したため、単にファイルを読み込んで、デバッグ目的で新しいファイルとして再度書き戻すことを試みました。これを行ったとき、新しいファイルは元のファイルよりも約 1kb 大きくなりました。UltraEdit でバイナリ比較を行うと、16 進文字 0A (ライン フィードだと思います) が表示される場所に、プログラムがその直前に 0D (キャリッジ リターン) を追加したように見えます。この動作の原因と、可能であれば回避する方法を考えていました。コード スニペットは次のとおりです。

....
std::string inputFilename = argv[1];
std::ifstream in( argv[1],ios::out | ios::binary);
if ( in )
{
std::stringstream fileStream;
fileStream<<in.rdbuf();
cout<<fileStream.str().length(); //debugging
in.close();
ofstream myfile;
myfile.open("selfoutput");
myfile<<fileStream.str();
myfile.close();
....

助けてくれてありがとう!-デビッド

4

1 に答える 1

2

試すios:in

std::ifstream in( argv[1],ios::in | ios::binary)

または、実際には

std::ifstream in( argv[1],ios::binary)

これは同等です:

最初に、デフォルトのコンストラクターと同じ手順を実行し、次に.を呼び出しrdbuf()->open(filename, mode | std::ios_base::in)てストリームをファイルに関連付けます。open() 呼び出しが null ポインターを返す場合、setstate(failbit) を設定します。

これが私の(テストされていない)単純化されたものです:

#include <fstream>

int main(int /*argc*/, const char *argv[])
{
    std::ifstream in(argv[1], std::ios::binary);
    if (in)
    {
        std::ofstream myfile("selfoutput", std::ios::binary);
        if (myfile)
            myfile << in.rdbuf();
    }
}

不当なコードゴルフと悪いスタイルの利益のために:

#include <fstream>
using namespace std;

int main(int /*argc*/, const char *argv[]) {
    ofstream("selfoutput", ios::binary) << ifstream(argv[1], ios::binary).rdbuf();
}
于 2013-09-25T18:48:53.717 に答える