如何从C ++中的文件夹中读取文件?

时间:2013-05-27 10:26:03

标签: c++ visual-studio-2010 io

我想使用c ++从文件夹中读取一些jpg文件。我搜索过互联网,但找不到解决方法。我不想使用Boost或其他库,只是用C ++函数编写它。例如,我有40个图像,在我的文件夹中以"01.jpg, 02.jpg,...40.jpg"命名,我想给出文件夹地址,并读取这40个图像并将它们一个一个地保存在矢量中。我试了好几次,但都失败了。我正在使用Visual Studio。有人可以帮我吗?谢谢。

1 个答案:

答案 0 :(得分:1)

我根据您的评论意识到您已使用_sprintf_s提出了可行的解决方案。微软喜欢将此作为sprintf的更安全的替代品来推广,如果你用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;
    }
}