3

私は C++ の学習を始めたばかりで、ハードディスクからイメージを取得して別の名前で保存するプログラムに取り組んでいます。元の画像はまだ残っているはずです。テキストファイルで動作するようになりました。これは、次のようにできるためです。

ifstream fin("C:\\test.txt");
ofstream fout("C:\\new.txt");

char ch;
while(!fin.eof())
{
    fin.get(ch);
    fout.put(ch);
}

fin.close();
fout.close();
}

でも、映像に関してはそうじゃないと思うんです。それを機能させるには、libなどをインストールする必要がありますか? または、含まれているライブラリを「そのまま」使用できますか? 私は C++ の専門家ではないので、完全に間違っている場合は教えてください。

誰かが私を助けてくれることを願っています!前もって感謝します!

ところで、画像は .png 形式です。

4

3 に答える 3

7

std ストリームを使用できますが、ストリームを開くときに ios::binary 引数を使用します。それは十分に文書化されており、インターネット上にいくつかの例があります

于 2013-01-11T18:09:00.730 に答える
2

MS Windows を使用しているようです: Windows は、行区切りの異なる処理によって「テキスト」ファイルと「バイナリ」ファイルを区別します。バイナリ ファイルの場合、読み取り時に変換\n\rする必要はありません。\nそれを防ぐには、@Emil が教えてくれるように、ファイルを開くときに ios::binary モードを使用します

\\ところで、ウィンドウの下のパスで使用する必要はありません。スラッシュを使用するだけです:

ifstream fin("C:/test.txt");

これは、MS-DOS を使用した第二次世界大戦でも機能しました。

于 2013-01-11T18:15:16.237 に答える
0

ファイルをコピーするだけの場合は、手動でコピーするよりもCopyFileを使用することをお勧めします。

#include <Windows.h>
// ...
BOOL const copySuccess = CopyFile("source.png", "dest.png", failIfExists);
// TODO: handle errors.

Windows API を使用できない場合、これまでのように一度に 1 文字ずつファイルをコピーするのは非常に非効率的な方法です。他の人が指摘しているように、ファイルをバイナリとして開いて、I/O が行末で混乱するのを避ける必要があります。一度に 1 文字ずつ処理するよりも簡単で効率的な方法は次のとおりです。

#include <fstream>
// ...
std::ifstream fin("source.png", std::ios::binary);
std::ofstream fout("dest.png", std::ios::binary);
// TODO: handle errors.
fout << fin.rdbuf();
于 2013-01-11T22:52:49.227 に答える