3

jpgC ++を使用してフォルダーからいくつかのファイルを読み取りたいです。私はインターネットを検索しましたが、これに対する解決策を見つけることができませんでした。Boost や他のライブラリを使用したくありませんが、C++ 関数で記述するだけです。たとえば、フォルダーに によって名前が付けられた 40 個の画像があり"01.jpg, 02.jpg,...40.jpg"、フォルダーのアドレスを指定して、これらの 40 個の画像を読み取り、1 つずつベクターに保存します。何度か挑戦しましたがだめでした。Visual Studio を使用しています。誰かがこれについて私を助けることができますか? ありがとうございました。

4

1 に答える 1

1

あなたのコメントに基づいて、 を使用して実行可能なソリューションを考え出したことがわかりました_sprintf_s。Microsoft は、C でプログラムを作成している場合に、これをより安全な代替手段として推奨することを好みsprintfます。これは、C でプログラムを作成している場合に当てはまります。ただし、C++ では、バッファーを管理したり、C++ の知識を必要としない、文字列を作成するためのより安全な方法があります。最大サイズです。それについて慣用的にしたい場合は_sprintf_s、使用をやめて、C++ 標準ライブラリによって提供されるツールを使用することをお勧めします。

以下に示すソリューションでは、単純なforループstd::stringstreamを使用してファイル名を作成し、画像をロードします。std::unique_ptrまた、ライフタイム管理と所有権のセマンティクスに対する の使用も含めました。std::shared_ptr画像の使用方法によっては、代わりに使用する必要がある場合があります。

#include <iostream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <stdexcept>

// Just need something for example
struct Image
{
    Image(const std::string& filename) : filename_(filename) {}
    const std::string filename_;
};

std::unique_ptr<Image> LoadImage(const std::string& filename)
{
    return std::unique_ptr<Image>(new Image(filename));
}

void LoadImages(
    const std::string& path,
    const std::string& filespec,
    std::vector<std::unique_ptr<Image>>& images)
{
    for(int i = 1; i <= 40; i++)
    {
        std::stringstream filename;

        // Let's construct a pathname
        filename
            << path
            << "\\"
            << filespec
            << std::setfill('0')    // Prepends '0' for images 1-9
            << std::setw(2)         // We always want 2 digits
            << i
            << ".jpg";

        std::unique_ptr<Image> img(LoadImage(filename.str()));
        if(img == nullptr) {
            throw std::runtime_error("Unable to load image");
        }
        images.push_back(std::move(img));
    }
}

int main()
{
    std::vector<std::unique_ptr<Image>>    images;

    LoadImages("c:\\somedirectory\\anotherdirectory", "icon", images);

    // Just dump it
    for(auto it = images.begin(); it != images.end(); ++it)
    {
        std::cout << (*it)->filename_ << std::endl;
    }
}
于 2013-05-27T16:15:52.577 に答える