2016-08-04 4 views
0

Привет, я пытаюсь создать графический интерфейс для программного обеспечения для сравнения изображений. Идея состоит в том, чтобы выбрать картинку с OPENFILENAME, а затем получить свой адрес с помощью inn.lpstrFile, затем создать гистограмму для этого изображения. Поэтому я использую:Как сохранить ofn.lpstrFile для правильной строки?

return(ofn.lpstrFile); 

Я могу COUT адрес или записать его в файл .xml и адрес правильный, но когда я пытаюсь сделать гистограмму это дает мне все нули. Поведение, подобное адресу, было неверным.

Любые идеи?

мой код:

string path=browse(); //getting the string from ofn.lpstrFile 

    path.c_str(); 
    replace(path.begin(), path.end(), '\\', '/'); //converting backslash to slash also may be the problem  
    HistCreation(path,root_dir); 

и

void HistCreation(string path,string root_dir) { 

Mat img; 
img = imread(path); // here if i manually enter the address everything works fine, if I insert the path then loads empty image 

. 
. 
. 

Я также попытался

char * cstr = new char[path.length() + 1]; 
    std::strcpy(cstr, path.c_str()); 

Не работает либо

+2

Используйте 'std :: wstring' для возврата строк. Возвращающиеся указатели - плохая идея, если вы не знаете, что делаете. –

+0

Вы не пытаетесь сделать гистограмму * имени файла *, не так ли? – molbdnilo

+0

Спасибо за ответ !. @BarmakShemirani Я попытался {wstring path = ofn.lpstrFile}, но он говорит: нет подходящего конструктора для преобразования из LPSTR в строку, wchar, char, wchar_t вы можете быть более конкретным, пожалуйста? –

ответ

0

std::string возвращает строку и это все, что вы пе редактор Это пример, чтобы открыть файл растрового изображения.

(Edit)

#include <iostream> 
#include <string> 
#include <windows.h> 

std::string browse(HWND hwnd) 
{ 
    std::string path(MAX_PATH, '\0'); 
    OPENFILENAME ofn = { sizeof(OPENFILENAME) }; 
    ofn.hwndOwner = hwnd; 
    ofn.lpstrFilter = 
     "Image files (*.jpg;*.png;*.bmp)\0*.jpg;*.png;*.bmp\0" 
     "All files\0*.*\0"; 
    ofn.lpstrFile = &path[0]; 
    ofn.nMaxFile = MAX_PATH; 
    ofn.Flags = OFN_FILEMUSTEXIST; 
    if (GetOpenFileName(&ofn)) 
    { 
     //string::size() is still MAX_PATH 
     //strlen is the actual string size (not including the null-terminator) 
     //update size: 
     path.resize(strlen(path.c_str())); 
    } 
    return path; 
} 

int main() 
{ 
    std::string path = browse(0); 
    int len = strlen(path.c_str()); 
    if (len) 
     std::cout << path.c_str() << "\n"; 
    return 0; 
} 

Примечание, Windows использует NUL-законченный C-строку. Он знает длину строки, ища нуль в конце.

std::string::size() не всегда одно и то же. Мы можем назвать изменение размера, чтобы убедиться, что они одно и то же.


Вы не должны заменить \\ с /. Если ваша библиотека жалуется \\ затем заменить следующим образом:

Пример:

... 
#include <algorithm> 
... 
std::replace(path.begin(), path.end(), '\\', '/'); 

Использование std::cout для изучения выход вместо того, чтобы гадать, если он работал или нет. В программе Windows вы можете использовать OutputDebugString или MessageBox, чтобы узнать, что такое строка.

HistCreation(path, root_dir); 

Я не знаю, что root_dir должно быть. Если HistCreation терпит неудачу или имеет неправильный параметр, тогда у вас другая проблема.

+0

Удивительный! @BarmakShemirani с некоторыми изменениями, я должен работать сейчас. Большое спасибо, я работал над этим целый день. Я отредактирую ваше сообщение в форме, которую я должен сейчас сделать, чтобы сделать ответ более точным. Хороший человек работы спасибо! –

+0

Я прокомментировал некоторые из предложенных вами изменений. 'path.erase (path.begin() + a, path.end());' ничего не делает. Строка прекрасная, как есть. –

+0

странно .... если я распечатаю путь, я вижу что-то вроде этого: C: /path/dir/image.jpgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa. вот почему я использовал эту уху –

Смежные вопросы