2016-09-26 2 views
1

вот моя проблема: Я хочу развернуть имя файла, которое пользователь дает программе в SaveFileDialog с номером индекса. Я получаю полный путь из диалога и поиска '.' в этом.Получить имя_файла из SaveDialog и изменить его динамически C++

System::String^ str = saveFileDialog1->FileName; 
    pin_ptr<const wchar_t> wch = PtrToStringChars(str); 
    size_t convertedChars = 0; 
    size_t sizeInBytes = ((str->Length + 1) * 2); 
    errno_t err = 0; 
    char *FileName = (char*)malloc(sizeInBytes); 
    err = wcstombs_s(&convertedChars, 
     FileName, sizeInBytes, 
     wch, sizeInBytes); 
for (size_t i = 0; i < sizeof((*FileName)); i++) 
    { 

     if (FileName [i]=='.') 
     { 



     } 
} 

и в этот момент я пробовал разные вещи, чтобы редактировать FileName с:

insert(i-1, ("_%i",i)); 

Ничего я пытался, работает так, как я хочу.

Я хочу сохранить разные фотографии камеры, и с помощью этого индекса пользователю легче найти нужную картинку.

Заранее благодарен!

Кнут

+0

Я не понимаю, что вы на самом деле пытаетесь достичь. Не могли бы вы описать полный вариант использования с точки зрения пользователя? – Firzen

+0

Пользователь может сделать выбор, сколько фотографий должна выполнить программа. Затем программа автоматически выполняет снимки с различными настройками камеры. Я хочу найти часть параметра в имени файла. Тогда легче найти картинку. Чтобы увеличить число в конце имени файла, нужно только проверить, как он может работать. –

+0

Пользователь дает мне, например, путь c: \ user \ document \ filename.txt. Что я хочу сделать, так это то, что моя программа сохранит новое изображение как filename_1 и увеличит число для каждого нового изображения. –

ответ

0

Таким образом, вы в основном нужно разделить имя файла в необработанном имя и расширение, а затем соединить эти части с некоторым индексом. Вы можете использовать эту функцию:

string get_indexed_name(string filename, string index) 
{ 
    size_t lastindex = filename.find_last_of(".");  // get position of dot 
    string rawname = filename.substr(0, lastindex); // get string contents before dot 
    string extension = filename.substr(lastindex + 1); // get string contents after dot 

    return rawname + index + "." + extension;   // return indexed name 
} 

Этот способ использует предопределенные стандартные функции. Если вы хотите (и учиться) самостоятельно, попробуйте реализовать функции find_last_of и substr. Затем вы можете использовать свою собственную реализацию.

Если есть какая-то проблема компиляции, убедитесь, чтобы начать свой исходный код этих строк:

#include <iostream> 
using namespace std; 
+0

точно, когда вы отправили свой ответ, я получаю его сам: D. Спасибо за это решение и за ваши вопросы, которые позволяют мне найти решение самостоятельно. –

+0

Я рад, что вы смогли решить это самостоятельно. Поздравления! – Firzen

0

Вот мое решение:

System::String^ str = saveFileDialog1->FileName; 


    std::string sFilePath = msclr::interop::marshal_as<std::string>(str); 
    std::string fileExtension=msclr::interop::marshal_as<std::string>(str); 
    size_t pos= sFilePath.find('.', 1); 
    sFilePath = sFilePath.substr(0, pos); 
    fileExtension = fileExtension.substr(pos);        
    for(size_t i=0; i<100; i++){        
      std::string fileName; 
      fileName = sFilePath + std::to_string(i) + fileExtension;} 

Для этого решения вы должны включить.

#include <msclr\marshal_cppstd.h> 

И если вы хотите, чтобы ваш номер файла с выведенными нулями вы должны использовать stringstream вроде этого:

 string fileName; 
     string fileNumber ; 
     stringstream ss; 
     ss <<'_'<< setfill('0') << setw(4) << std::to_string(i); 
     fileNumber = ss.str(); 
     fileName = f_sFilePath + fileNumber + f_sFileExtension; 
Смежные вопросы