2009-12-15 23 views
6

C++ için Qt ile birlikte gelen (ancak Qt bağımlılığı olmadan) platform bağımsız bir kaynak sistemi var mı?Platform bağımsız bir kaynak sistemi (Qt Kaynak sistemi gibi)

C++ kaynak kodumun içinden rastgele verilere erişmek istiyorum. Yani, sadece simgeler değil, aynı zamanda çeviriler veya gölgelendiriciler, vb.

Alternatif olarak, ör. ZIP sıkıştırılmış bir dosya veya bunun gibi ihtiyaçlarmı da karşılar.

+0

Kaynakların yürütülebilir dosyanıza gömülmesi gerekiyor mu? Değilse başka bir yol dosyaları depolamak için SQLite kullanıyor olabilir - bu hafif veritabanı ile çalışmaya başlamak ve çok fazla çaba olmaz. – Rob

+0

Benzer: http://stackoverflow.com/questions/549031/how-do-you-include-images-as-resources-in-a-c-executable – Rob

cevap

8

Temelde bir grup dosya (HTML, CSS, JS, PNG, vb.) Alan ve C++ üstbilgileri static const char* olarak kodlanmış verileri içeren bir C++ web sunucusu projesi için kendi sistemimi hazırladım. O zaman verilere erişmem gereken üstbilgiler #include. 'Kaynak' dosyalarını kodlayan uygulama bir yapım öncesi adımı olarak yürütülür. Kodlama uygulaması, kaynak başlıklarını oluşturmak için boost::filesystem'u kullanıyordu, bu nedenle Windows/* nix'te çalışıyor.

Tipik kaynak dosyası aşağıdaki gibi görünebilir: Ben \x gösterimi kullanılarak şifreleyen ikili içerik için

namespace resource 
{ 
    // Generated from mainPage.htm 
    static const char* mainPage_[] = 
    { 
    "<html>...</html>" 
    }; 
} 

. Ayrıca, bir editörde okunabilmesi için verileri sıraya sardığınızdan emin oluyorum.

Bazı sorunlarım olsa da - MS derleyicisi, bir PITA olan 64Kb'den büyük olacak şekilde static const char*'a izin vermiyor. Neyse ki, bundan daha büyük olan tek dosyalar, daha küçük parçalara kolayca ayırabildiğim JavaScript dosyalarıydı - büyük görüntüler sorun olsa da.

+0

ve bunu neden yaptın? –

+4

Çapraz platformlu Qt benzeri bir kaynak sistemi bulamadım çünkü bu yüzden. Soruyu mantıklı bir cevap verdim ve beni reddettin? Teşekkürler! – Rob

0

Bunun için ICU ResourceBundle s kullanıyoruz ve oldukça memnun kaldık.

pkgdata tool'u kullanarak ResourceBundles'ın paketlenmesi oldukça esnektir: paylaşılan bir kitaplık, statik kitaplık veya ICU tarafından bellek eşlemeli dosyalar olarak.

0

Onları, dosya zamanının iki katı bloğu olarak, bağlantı zamanının sonuna kopyaladım. Son 4bayt ile önceki bloğun boyutu ve daha sonra program kuyruktan veri maddelerini okur.

Daha fazla dosya sistemi türü yapısına ihtiyacınız varsa başka bir yaklaşım (denemediğim halde) her şeyi bir zip dosyasına koymak ve sonuna kadar eklemek olacaktır. Yine, eklenen verilerin bazı kolayca findabale boyutuna ihtiyacınız olacaktır.