2

画像をスキャンして座標を返すために開発している C++ アプリケーションがあります。この最後の問題を除いて、アプリケーション全体が期待どおりに動作します。ユーザーが画像をフォルダーにアップロードすると、画像はキュー内のアプリケーションに対して一度に 1 つずつ実行されます。問題は、多くのフォルダーを持つ何千ものユーザーがいて、これらのユーザーのかなりの数が、フォルダー/ファイル名にスペース (例: " ") を含むフォルダー/ファイルをアップロードしていることです。

アプリケーションを実行するとクラッシュしますが、CImg がパス内のスペースを好まないという事実に絞り込みました。

パスにスペースがあるローカルマシンで実行するたびに、次のエラーが表示されますが、これはあまり意味がありません。

jpeg-info.exe の 0x00BE05F7 で未処理の例外: 0xC00000FD: スタック オーバーフロー >(パラメーター: 0x00000000、0x00242000)。

[CImg] * CImgIOException * [instance(0,0,0,0,00000000,non-shared)] CImg::load(): ファイル 'J:\uploads\41039\test name' を開けませんでした

[CImg] * CImgIOException * cimg::fopen(): モード 'rb' でファイル 'J:\uploads\41039\test name' を開けませんでした。

失敗するコード行は here です。

const char* imagePath = filename.c_str();
CImg<unsigned char> loadImage(imagePath);

文字列にスペースを含むCImgへのパスを渡す方法を見つける必要があるだけで、壊れません。

補足: この解決策を見つけやすくするために、boost ファイルシステムをインストールしています。

編集:

この問題を修正するのに運がなかったので、ファイル名を2つの異なる方法で取得していました..

元の方法: (const char を直接渡す)

const char* filename = cimg_option("-i", "path/to/file/jpeg.jpg", "input jpeg path");

新しい方法:(パスを取得し、ブーストを使用して適切にフォーマットします)

const char* getInput = cimg_option("-i", "path/to/file/jpeg.jpg", "input jpeg path");
std::string filename = boost::filesystem::absolute(getInput).string();
4

0 に答える 0