2009-10-11 60 views
1

SDL或C++中是否有任何设备允许您从文件夹中读取图像文件而无需指定其名称,如按顺序读取等等?如果没有,你有什么技术可以用来完成同样的任务?在没有指定名称的情况下读取图像文件

做这样的事情:

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

会变得非常繁琐,并且无法使用的循环,因为文件名是特定各一次。

我真正想到的唯一方法可能是通过每个循环迭代器修改一个字符串,并将循环数插入字符串的特定部分,假定这是您的文件如何标记的,并将该字符串用作LoadImage参数。这似乎更多的工作,而不仅仅是做上述。

回答

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还提供了一个简单的目录迭代器。

+0

非常有帮助。谢谢。 – trikker 2009-10-11 20:04:49

1

对于这种情况,你会得到通常在目录中的文件名列表(用opendir/readdir或适当FindFirstFile/FindNextFile),并在目录中的每个文件名循环。给定每个文件名,你可以调用LoadImage()并将结果追加到你的数组中。

这种技术并不要求你提前知道文件名。

0

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

foo_ani = LoadImages("Animations/"); 

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

另一种解决方案是,如果您有几个不同前缀的动画,则使用正则表达式。我建议你使用boost为或std::tr1::regex,像这样:

foo_ani = LoadImageSet("Animations/", std::tr1::regex("foo*.png")); 
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帧的动画,我会说这很容易。

相关问题