2009-10-11 66 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幀的動畫,我會說這很容易。

相關問題