2016-08-04 7 views
0

안녕하세요, 저는 이미지 비교 소프트웨어 용 GUI를 만들려고합니다. OPENFILENAME이있는 사진을 선택한 다음 ofn.lpstrFile을 사용하여 주소를 가져 와서 해당 이미지에 대한 막대 그래프를 만드는 것이 아이디어입니다.ofn.lpstrFile을 문자열에 올바르게 저장하는 방법은 무엇입니까?

return(ofn.lpstrFile); 

내가 주소를 법원 또는 .xml 파일로 작성하고 주소가 올바른지 수 있지만, 나는 그것이 나에게 모든 0을 제공 히스토그램을하려고 할 때 : 그래서 내가 사용합니다. 주소와 같은 행동이 잘못되었습니다.

아이디어가 있으십니까?

내 코드 :

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 경로 = ofn.lpstrFile} tryed하지만 그것은 말합니다 : LPSTR 문자열, wchar, char, wchar_t 변환 할 수있는 적절한 생성자 당신이 더 구체적인 수 제발? –

답변

0

std::string 반환 문자열 중 하나를 작동하지 않았다 에드. 비트 맵 파일을 여는 예입니다.

(편집)

#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-문자열을 사용합니다. 마지막에 0을 찾아 문자열의 길이를 알고 있습니다.

std::string::size()이 항상 동일한 것은 아닙니다. resize를 호출하여 같은 크기인지 확인할 수 있습니다.


당신은 /\\를 교체 할 필요가 없습니다. 라이브러리에 대한 \\을 불평하는 경우 다음과 같이 대체합니다

예 :이 일을하거나하지 않을 경우

... 
#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.jpgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa. 내가 그 귀걸이를 사용한 이유 –

관련 문제