CString m_strPath, str;

CStdioFile rFile;

CFileException ex;

CFileDialog dlg(TRUE, _T("*.txt"), NULL, OFN_FILEMUSTEXIST | OFN_OVERWRITEPROMPT, _T("TXT Files(*.txt)|*.txt|"), NULL);

if (dlg.DoModal() == IDOK)

{

     m_strPath = dlg.GetPathName();

     rFile.Open(m_strPath, CFile::modeReadWrite | CFile::typeText, &ex);

while (rFile.ReadString(str))

{

     getFileString += (str + _T("\r\n"));

}

rFile.Close();

 

// edit control에 txt파일 쓰기

mFileView.SetWindowTextW(getFileString);

}

BOOL DeleteDirectoryFile(LPCTSTR RootDir)

{

if (RootDir == NULL) { return FALSE; }

BOOL bRval = FALSE;

CString szNextDirPath = _T("");

CString szRoot = _T(""); // 해당 디렉토리의 모든 파일을 검사한다.

szRoot.Format(_T("%s\\*.*"), RootDir);

CFileFind find; bRval = find.FindFile(szRoot);

if (bRval == FALSE)

{ return bRval; }

 

while (bRval)

{

   bRval = find.FindNextFile(); // . or .. 인 경우 무시 한다.

   if (find.IsDots() == FALSE)

    {

    // Directory 일 경우 재귀호출 한다.

    if (find.IsDirectory())

    {

       DeleteDirectoryFile(find.GetFilePath());

     }

     // file일 경우 삭제

     else

     {

        bRval = DeleteFile(find.GetFilePath());

      }

    }

  }

find.Close();

bRval = RemoveDirectory(RootDir);

return bRval;

}

MFC  에서 ListBox에 출력 된 정보들을 *.txt 파일로 저장할 때

 

void CContentLogDlg::OnSave(void)
{

 LPCTSTR lpszFilter = _T( "txt파일(*.txt)") ;

 // 파일 공용컨트롤 대화상자 인스턴스 생성.. 첫번째 인자가 TRUE 이면 읽기 FALSE 이면 쓰기.
 CFileDialog FileDlg( FALSE, _T( ".txt" ), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, lpszFilter, NULL );

 if( FileDlg.DoModal() == IDOK )   
{

   CString sPath( FileDlg.GetPathName() );
   CFile File( sPath, CFile::modeWrite | CFile::modeCreate );

   CString sData = NULL;
   
    for( int i=0; i < m_ctrLogList.GetCount() ; ++i){
        m_ctrLogList.GetText( i, sData );
        sData += _T("\r\n");
        File.Write( (LPCTSTR)sData, sData.GetLength() * sizeof(TCHAR) );
  }

File.Flush();
File.Close();

CContentLogDlg::AddLog("File Save Complite!!");


 }

헷갈리기 쉽지만, 

하기처럼 하면 됨.

 

 

float fDat = 112.445;


std::vector<void*> aDat;
aDat.push_back((void*)&fDat);

LPVOID lpVoid = aDat.at(0);
float aDat1 = *(float*)lpVoid;

float fDat2 = *(float*)aDat.at(0);

 

 

int 형태

ULONG anCount = (ULONG)aDat.at(0);

 

항상 헷갈리는 이슈.

 

유니코드 환경에서 WCHAR을 사용하곤하지만,

CString의 편리함을 잊을수 없기에.. 

 

하기처럼 define해 놓고 쓰면 편하다.

 

CString -> string

#define CSTR2STR(s) ((string)CT2CA(s.operator LPCWSTR()))

 

string -> CString   %S 대문자로 기록하면 변환가능

CString szBuf;

string sz;

szBuf.Format("%S", sz.c_str());

 

[MSDN에서 발췌]

// 가변인자로 받아 처리하기

Requirements

Header Use for

cstringt.h MFC-only string objects
atlstr.h Non-MFC string objects

void WriteString(LPCTSTR pstrFormat, ...)
{
CString str;

// format and write the data you were given
va_list args;
va_start(args, pstrFormat);

str.FormatV(pstrFormat, args);
va_end(args);

_tprintf_s(str);
return;
}

비쥬얼 스튜디오 - 단위 테스트(유닛 테스트)

 

MS 참고.

https://docs.microsoft.com/ko-kr/visualstudio/test/getting-started-with-unit-testing?view=vs-2019&viewFallbackFrom=vs-2015

 

유닛 테스트 시작 - Visual Studio

유닛 테스트 시작Get started with unit testing 이 문서의 내용 --> Visual Studio를 사용하여 단위 테스트를 정의하고 실행하여 코드 상태를 유지 관리하고, 코드 적용 범위를 확인하고 , 고객이 찾기 전에 오류와 결함을 찾을 수 있습니다.Use Visual Studio to define and run unit tests to maintain code health, ensure code coverage, and find er

docs.microsoft.com

하기 블로그 참고.

https://m.blog.naver.com/sogangori/220608227176

 

비쥬얼 스튜디오 - 단위 테스트(유닛 테스트)

비쥬얼 스튜디오에 C++과 C#의 유닛 테스트 프로젝트가 내장되어 있습니다. 즉시 사용할 수 있기 때문에 ...

blog.naver.com

 

 

 

하기처럼 하는데 속도가 개선됨.

 

float **arr;
arr = (float **)malloc(sizeof(float *) * nX);
arr[0] = (float *)malloc(sizeof(float) * nX*nY);
for (int i = 1; i < nX; i++){
arr[i] = arr[i - 1] + nY;
}

arr[0][1000] = 500.4f;
arr[1000][1000] = 1000.4f;
arr[1999][1000] = 2000.4f;


float **arr1;
arr1 = (float **)malloc(sizeof(float *) * nX);
arr1[0] = (float *)malloc(sizeof(float) * nX*nY);
for (int i = 1; i < nX; i++){
arr1[i] = arr1[i - 1] + nY;
}


DebugString(L"parallel_for copy .. start");
concurrency::parallel_for(0, nX, [&](int X)
{
memcpy(arr1[X], arr[X], (sizeof(float) * nY));
});
DebugString(L"parallel_for copy .. stop");

현재 시간을 출력하면서 로그로 확인하기

가변인자를 활용

 

void TestProc::DebugString(LPCTSTR alpszData, ...)

{

CString strRcv;

va_list argptr;

va_start(argptr, alpszData);

strRcv.FormatV(alpszData, argptr);

va_end(argptr);

 

CString str;

SYSTEMTIME sysTime;

::GetLocalTime(&sysTime);

str.Format(L"%02d:%02d:%02d.%03d %ws\n", sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds, strRcv);

OutputDebugString(str);

}

wsprintf는 부동소수점 수를 출력하는 포맷이 없습니다.

 

%f, %lf 지원 안합니다.

 

 

부동소수점수를 출력하고 싶으면, 직접 함수를 만들면됩니다.

 

만들기 싫으면 c의 함수인 sprintf 를 사용하면 됩니다.

 

혹시 유니코드를 사용한다면 swprintf 를 사용하면 됩니다.

 

멀티바이트나 유니코드 신경 안쓰고 사용할려면 _stprintf 를 사용하면 됩니다.

 

 

sprintf 함수는 stdio.h 에 선언 되어 있으니 , 이 헤더 파일을 포함 시켜 주면 됩니다.

+ Recent posts