2013-05-27 3 views
3

Я хочу прочитать некоторые файлы jpg из папки с помощью C++. Я искал в Интернете и не мог найти решение этого. Я не хочу использовать Boost или другие библиотеки, но просто пишу его в функции C++. Например, у меня 40 изображений, названных по "01.jpg, 02.jpg,...40.jpg" в моей папке, я хочу указать адрес папки и прочитать эти 40 изображений и сохранить их один за другим в векторе. Я пробовал несколько раз, но не смог. Я использую Visual Studio. Может ли кто-нибудь помочь мне в этом? Спасибо.Как читать файлы из папки на C++?

+1

попробуйте findfirstfile и findnextfile в sdk или cfilefind в mfc. – Jichao

+1

Как насчет запуска с 'for (int i = 1; i <= 40; i ++) {...}'? Затем прочитайте о ['std :: istringstream'] (http://en.cppreference.com/w/cpp/io/basic_istringstream). –

+1

См. Ответы на этот вопрос о том, как это сделать, используя API Win32: http://stackoverflow.com/questions/15068475/recursive-hard-disk-search-with-findfirstfile-findnextfile-c – Asha

ответ

1

Я понимаю, основываясь на ваших комментариях, что вы нашли работоспособное решение, используя _sprintf_s. Microsoft любит продвигать это как более безопасную альтернативу 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; 
    } 
} 
Смежные вопросы