读取图像文件而不指定名称

时间:2009-10-11 19:33:44

标签: c++ sdl

SDL或C ++中是否有任何设施允许您从文件夹中读取图像文件而不指定其名称,例如按顺序读取它们等等?如果没有,你用什么技术来完成同样的事情?

做这样的事情:

foo_ani[0] = LoadImage("Animations/foo1.png");
foo_ani[1] = LoadImage("Animations/foo2.png");
foo_ani[2] = LoadImage("Animations/foo3.png");

可能变得相当繁琐,并且不能使用循环,因为每次文件名都是特定的。

我能想到的唯一方法是使用一个字符串,你可以通过每个循环迭代器修改它,并将循环数插入字符串的特定部分,假设你的文件是如何标记的,并使用该字符串作为LoadImage参数。这似乎比做上述工作更有效。

4 个答案:

答案 0 :(得分:2)

使用boost::filesystem

此处显示的小程序列出目录files/中的所有文件,与模式fileN.type匹配,其中N为0及以上,未指定。

#include <iostream>
#include <sstream>
#include <string>
#include <boost/filesystem.hpp>

using namespace std;
namespace fs = boost::filesystem;
int main(int argc, char** argv)
{
    fs::path dir ("./files");
    string prefix = "file";
    string suffix = "type";
    int i = 0;

    fs::path file;

    do {
        stringstream ss;
        ss << prefix << i++ << "." << suffix;
        file = fs::path(dir / fs::path(ss.str()));
        if(fs::exists(file)) {
            cout << file.leaf() << " exists." << endl;
        }
    } while(fs::exists(file));
    return 0;
}

-lboost_filesystem链接。

boost::filesystem还提供了一个简单的目录迭代器。

答案 1 :(得分:1)

对于这种情况,您通常会获得目录中的文件名列表(根据需要opendir / readdirFindFirstFile / FindNextFile),并循环目录中的每个文件名。给定每个文件名,您可以调用LoadImage()并将结果追加到数组中。

此技术不要求您提前知道文件名。

答案 2 :(得分:0)

如何自动加载该目录中的所有文件?

foo_ani = LoadImages("Animations/");

只需遍历给定的目录并加载适合的所有文件。

另一种解决方案,如果你有几个不同前缀的动画是使用正则表达式。我建议您使用booststd::tr1::regex,如下所示:

foo_ani = LoadImageSet("Animations/", std::tr1::regex("foo*.png"));

答案 3 :(得分:0)

鉴于您目前正在对帧的名称进行硬编码,我将假设您知道/可以控制文件的命名方案。我也假设你想要它们顺序,因为它似乎是动画中的帧。最后,我假设您知道有多少帧,因为您似乎有一个足够大的阵列可以容纳所有准备好的等待。

考虑到问题中提供的文件的名称,你不能只做FindFirst / FindNext,因为一旦你超过10帧,它们几乎肯定会出现故障(鉴于提供的命名方案)

所以我认为你是对的,最好的方法是循环,但错误的是它比手工做更多的努力。

char* fname = new char[50]; // buffer big enough to hold filenames
int numFrames = 8; // or however many, you seem to know what this value should be

for(int i = 0; i < numFrames;  ++i)
{
    sprint(fname, "Animations/foo%d.png",(i+1));
    foo_ani[i] = LoadImage(fname);
}

delete[] fname;

大约有6行代码。因此,对于超过6帧的动画,我会说这更容易。