2015-01-15 1 views
0

저는 C++로 작성하기 위해 파일을 열기 위해 ofstream의 open (...)을 사용하려고합니다. 어떤 이유 때문에, stringstream에서 생성 된 char * 또는 string을 사용하면 실패합니다. 즉 ofstream 객체의 fail() 함수는 true를 반환합니다 (확인 및 콘솔 메시지로 확인 됨). 아래를 참조하십시오 :ofstream open (...) stringstream에서 생성 된 char 포인터를 전달할 때 실패했습니다.

이렇게하면 콘솔에 '실패'가 인쇄됩니다. 디버거를 사용하여 logPath가 실제로 올바른 예상 문자열을 가리키는 지 확인했습니다.

C:\Logs\2015:01:15:18:34:10.txt 

그러나 개방 (...) 여전히 상태를 실패 화나게 : 나는 < < 단지 stream.open있는 행하기 전에 cout을 할 경우 예, 그것은 예를 들어,뿐만 아니라 콘솔에 올바른 경로를 인쇄 파일에 쓸 수 없습니다. 그러나 logPath에 대신 문자열 리터럴을 채우는 경우

char * logPath = "c:\\logs\\log.txt"; 

그러면 작동합니다. 더구나, 분명히 내가 열린 경로 (...)에 직접 경로를 사용하여 문자열 리터럴을 넣으면 작동합니다.

stream.open(ss.str().c_str(), ios::out | ios::app); 

이유 : 타임 스탬프 생성기를 사용하는 경우

이 또한 실패? ofstream open (...) 호출이 읽을 수있는 stringstream에서 C 문자열/char *을 어떻게 얻을 수 있습니까? 이는 또한 실패 상태가됩니다.

stream.open(ss.str(), ios::out | ios::app); 

또한 append 명령을 사용하여 문자열을 작성하면 실패합니다. 예컨대 :

string path; 
path.append(DIRECTORY_PATH); 
path.append(generateTimestamp()); 
path.append(".txt"); 
stream.open(path, ios::out | ios::app); 

내가 디버깅 또는 인쇄 (예를 들어 cout을 < < 경로) 콘솔에 경우는, 실패, 그러나 다시 나는이 예상되는 경로를 얻을 :

C:\Logs\2015:01:15:18:34:10.txt 

내가 무엇을 놓치고를?

+0

디버거에서 복사 한 후 logPath의 내용을 확인하십시오. 나는 끝이 아닌 문제를 의심합니다. – user3159253

+0

'string'을 사용하기 전에'stringstream'을 닫지 않겠습니까? –

+0

@ user3159253 - 예, 내용을 확인했습니다. 그들은 나에게 맞는 것처럼 보입니다. 경우에 따라 수동으로 null 종료 '\ 0'을 경로 문자열의 끝에 추가하려고 시도했지만 그 중 하나도 작동하지 않았습니다. – Steverino

답변

2

간단한 대답은 Windows 파일 이름에서 불법 인 문자가 포함 된 함수에 의해 문자열이 생성 되었기 때문에 심야의 피로감을 간과했습니다.

내가 파일 경로로 사용하고있는 문자열의 일부가 시간 스탬프의 일부로 콜론 ':'을 반환하는 타임 스탬프 생성 함수에서 읽혀지고 있습니다. 이 함수는 콘솔 출력용 이었지만 파일 이름을 생성 할 때이 함수를 사용하려고했습니다. Windows는 물론 파일 이름에 콜론 ':'을 사용할 수 없습니다.

+0

그러나 이것은 당신의 질문이 잘못된 정보를 제공했다는 것을 의미합니다.위에 표시된 실제 코드 샘플은 잘 작동합니다. – jxh

+0

당신이 옳습니다. 원래 내가 잘못한 것을 반영하기 위해 질문을 편집 할 것입니다. 다른 문자열 경로를 사용하면 내가 게시 한 시점에 다른 결과가 발생한다는 사실을 알지 못했습니다. – Steverino

+0

@jxh S.O.에 글을 올릴 때 새로운 점이 있습니다. 제 질문을 개선하기위한 적절한 조치를 취하고, 질문에 대한 수정이 적합한 지 알려주세요. – Steverino

관련 문제