2014-09-16 2 views
0

로컬 시간과 지정된 문자열을 출력하는 함수를 작성하려고합니다. 가독성을 위해 끝에 줄 바꿈 문자를 추가합니다.Fprintf 디버그에서의 기괴한 출력

는 현재 코드 그게 전부 :

void errLog(const std::string errorString) 
{ 
    FILE* errorLog; 
    fopen_s(&errorLog, "ErrorLog.txt", "ab+"); 
    time_t rawTime; 
    time (&rawTime); 
    struct tm errorTime; 
    localtime_s(&errorTime, &rawTime); 
    char timeString[20]; 
    strftime(timeString, 20, "%d-%m-%Y %H:%M:%S", &errorTime); 
    fprintf(errorLog, "%s Error: %s\n", timeString, errorString); 
    fclose(errorLog); 
} 

출력은 내가 릴리스 모드에서 예상 된 일이다.

16-09-2014 10:58:45 Error: devFont.ttf load failed 

을하지만 디버그 모드에서 출력은 임의의 문자열을 찍은 것 같습니다 : 작업 프로그램에 Errorlog.txt에 의도 한대로,이 새로운 라인을 가지고있다. 이러한 저 명백 설명없이 임의의 두 개의 연속적인 출력이다 :

16-09-2014 11:13:57 Error: ΘυB 
16-09-2014 11:14:09 Error: Μϊ; 

함수가 호출에 하드 코딩 된 문자열 부여되므로 errlog에의 입력이 완전히 동일하다.

fprintf(errorLog, "%s Error: %s\n", timeString, errorString.c_str()); 

그것은 새로운 건설을 강제하는 것보다 const를 참조 const std::string& errorString로 매개 변수를 받아들이는 일반적으로 대부분의 경우에 더 효율적입니다 :

+0

일부 메모리 누수 또는 메모리 손상 * 기타 일 수 있습니다. –

+0

fprintf 호출에서 errorString.c_str()을 시도하십시오. –

답변

1

당신은 인 fprintf 통과하는 문자 포인터에 액세스 할 수 c_str()를 사용할 필요가 필수가 아닐 때 매개 변수의 문자열.

+0

그것은 효과가 있었다. 문자열은 함수가 호출 될 때 생성 (하드 코드)되므로 함수에 대한 입력으로 만 존재하는 문자열에 대한 문자열과 포인터를 만드는 데 시간이 낭비되지 않습니까? 릴리스에서 효과가 있었던 이유는 무엇입니까? 보시다시피 저는 C++ 및/또는 VS12에 대해 확신하지 못했습니다. – Oxy

+0

잘 모르겠다. 스택에서 전달 된 주소가 문자 데이터의 메모리에있는 주소와 함께 작동한다는 것은 평범한 오래된 행운 일 수 있습니다. –

+0

고마워요. – Oxy