-4

これが私の質問です。.jpg画像を開き、各バイトをコンマで区切った.txtファイルに書き込みました。それは成功でした。今、私はそのtxtファイルを使用してイメージを再構築したいと思います。img.txtは255,216,255,224,0,16,74,70,73,70,0,1,1.......のようになります。次のコードは、元の画像の場合のサイズでimage.jpgを作成しました。しかし、画像は表示されません。誰かからの助けを期待しています...

#include<iostream>
#include<string>
#include<fstream>
#include<sstream>
#include<cstdlib>
using namespace std;

int main(){

    char *s;
    long x;
    ifstream is("D:\\test\\img.txt");
    is.seekg(0,ios::end);
    x=is.tellg();
    is.seekg(0,ios::beg);

    s=new char[x];
    is.read(s,x);
    is.close();

    stringstream str;
    char a[4];
    int y = 0;
    for(int i=0; i<=x; i++) {
        if (s[i] != ',') {
            a[y] = s[i];
            y = y + 1;
        }
        if (s[i] == ',') {
            str << (unsigned char)atoi(a);
            a[0] = '\0';
            a[1] = '\0';
            a[2] = '\0';
            a[3] = '\0';
            y = 0;
        }
    }

    const char *ss=(str.str()).c_str();
    ofstream ex("D:\\test\\test.txt");
    ex << ss;

    ofstream fileo("D:\\test\\image.jpg",ios::binary);
    fileo.write(ss,(str.str()).length());
}
4

2 に答える 2

1

書かれたコードは、Visual Studio 10 SP1で機能しました。ただし、STL の実装 (および運) によっては微妙なバグがあります。

あなたのコード:

const char *ss=(str.str()).c_str();

範囲外の一時を使用しています。ssこの行が実行された直後 (または将来いつでも) が指し示すものはガベージである可能性があります。その理由はstd::stringstream::str()、文字列のコピーを返すためですstd::string::c_str()。このコピーを呼び出すのは安全ですが、元の (一時的な) スコープ外になると、そのポインターは無効になります。

これを修正するには、stringstreamオブジェクトから文字列をコピーして、有効期間がわかるようにしてください。次のようにします。

std::string contents = str.str();
ofstream ex("D:\\Profile2.jpg.txt");
ex<<contents;

ofstream fileo("D:\\Profile2.jpg",ios::binary);
fileo.write(contents.c_str(), contents.length());

繰り返しますが、どちらのバージョンも機能していますが、私が提案するバージョンは、運とは対照的に、実際には設計上機能しています。

于 2012-07-12T17:52:22.643 に答える
0

このタイプの問題のデバッグ プロセスは次のとおりです。

  • 可能な限り最小の入力 (文字「a」を含むテキスト ファイルで、「test01.jpg」として保存) を作成し、変換アルゴリズムを実行します。
  • ドメイン知識を使用して、期待される結果を判断します
  • 出力を調べて、それが期待どおりの結果かどうかを判断します
  • そうであれば、続行して「txtからjpgへ」の変換をテストします
  • それ以外の場合は、「jpg から txt へ」のアルゴリズムまたはドメインの知識を変更します。
  • txt出力が期待される結果であると仮定すると、「txt to jpg」を実行します
  • 結果が元のファイルと一致する場合 ('jpg' は単なる拡張子であることを忘れないでください。メモ帳でファイルを開くことができます。または、16 進エディターを使用することをお勧めします)、入力を変更して再度テストします。
  • それ以外の場合は、アルゴリズムを変更します

アイデアは、デバッガーで個々のステップをたどり、すべての命令が想定どおりに動作することを確認できるように、小さな入力を持つことです。

出力が入力と一致しないため、明らかに何かが意図したとおりに機能しません。1 つの特定の問題について助けを求めるよりも、自分で問題を解決できる方がはるかに重要です。

deleteプログラムの終了時にメモリが OS によって再利用されたとしても、(上記のコードで) バッファーもs使用しますが、これは良い習慣です。

于 2012-07-12T17:53:59.150 に答える