2012-09-23 4 views
-7

아래 코드를 수정하십시오.텍스트 파일을 읽고 쓰는 방법은 무엇입니까?

파일에 이미 항목이 있습니다. 첫 번째 행 사용자 이름; 두 번째 행 암호.

세 번째 줄에 쓰려면 확인란 상태가 필요하며 파일의 확인란 상태 값만 읽거나 변경해야합니다.

현재이 코드는 확인란 상태 값에 대한 값이있는 경우 작동하며 덮어 쓰거나 UI가 멈추는 경우 작동합니다.

WriteCheckStatusToFile(BOOL& locVar) 
{ 
    FILE *l_pFile = NULL; 
    CString l_strRememberCheck; 
    l_strRememberCheck = GetExePath() + _T("password"); 

    CString sVar; 
    sVar.Format(_T("%d"),locVar); 
    if(NULL != (l_pFile = fopen(l_strRememberCheck, _T("r+")))) 
    { 
     int count = 0; 
     char c; 
     while(count != 2) 
     { 
      if((c = fgetc(l_pFile)) == '\n') count++; 
     } 
     fseek(l_pFile,ftell(l_pFile),SEEK_SET); 
     fprintf(l_pFile, sVar); 
    } 
    l_strRememberCheck.ReleaseBuffer(); 
    fclose(l_pFile); 
} 

미리 감사드립니다.
sam.

+0

'sVar'는 C 문자열과 모양이 다릅니다. – fasked

+0

어떤 언어입니까? 'BOOL'과'CString'은 어떻게 정의되어 있습니까? – epsalon

+1

'C++'와'C'는 매우 다른 언어이며, 두 태그 모두 적용 할 수 없습니다. 귀하의 질문에 대해서만 적절한 태그를 사용하고 무작위로 선택하지 마십시오. –

답변

0

이 줄

fprintf(l_pFile, sVar); 

제대로 보이지 않습니다.

while(count != 2) 

내가 그것을해야한다고 생각 : 나는 파일 미만이 줄 바꿈이있는 경우 루프는 무한 될 수

fprintf(l_pFile, "%s\n", (LPCTSTR) sVar); 

해야한다고 생각을

while((count < 2) && (! feof(l_pFile)) && (c != EOF)) 

아마 관련이없는 당신의 오류가 발생하지만 적어도이 코드 스 니펫에서는 CString :: ReleaseBuffer()를 호출 할 필요가 없습니다. CString :: GetBuffer()를 호출하지 않았기 때문입니다. 이벤트에

fseek(l_pFile,ftell(l_pFile),SEEK_SET); 

두 광고 파일은 '\ n을 종료하지 : 파일 포인터가 이미 곳() fseek의 나타나는

l_strRememberCheck.ReleaseBuffer(); 

이 라인은 불필요 할 수있다 '다음과 같이 인쇄해야합니다.

if (count == 2) 
    { 
     fprintf(l_pFile, "%s\n", (LPCTSTR) sVar); 
    } 
    else 
    { 
     fprintf(l_pFile, "\n%s\n", (LPCTSTR) sVar); 
    } 
+0

내가 제안한대로 코드에서 변경했는데 체크 박스 상태가 항상 두 번째 줄에 추가되어 암호가 일치하지 않습니다. 텍스트 파일의 세 번째 줄을 추가해야합니다. 로직을 다시 확인하십시오. – user1609596

+0

제 생각에 두 줄짜리 파일이있을 때 두 번째 줄은 '\ n'으로 끝나지 않습니다. fprintf를 감싸는 경우에 이것을 추가 할 수 있습니다 : if (count == 2) fprintf (l_pFile, "% s \ n", sVar); else fprintf (l_pFile, "\ n % s \ n", sVar); – Scooter

+0

(LPCTSTR)을 잊었습니다. 정정은 해답 위에 있습니다. – Scooter

관련 문제