2011-05-03 2 views
0

현재 응용 프로그램 대리인의 freopen() 호출을 사용하여 NSLog() 출력을 파일로 리디렉션하고 있습니다. 나는 로그 파일 크기를 제한 할 좋아하지만 this-freopen() 및 stderr에 버퍼 제공 (iOS 응용 프로그램의 로그 파일 크기 제한)

unsigned long long fs = 3000; 
    while ([fileAttributes fileSize] < fs) { 

    freopen([FILEPATH cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr); 

    } 

가 무한 루프에 검은 화면에 붙어있을 수있는 응용 프로그램을 야기하고있는 것이다. stderr의 버퍼 크기를 설정할 수있는 방법이 있습니까? 그리고 나서 파일 크기 + 버퍼 크기가 파일 크기를 초과하지 않으면 파일에 계속 쓰기 만하는 루프가 있습니까?

답변

0

무한 루프에 빠져있는 것처럼 보입니다. 그렇게 할 수는 없지만 파일 크기가 fs보다 크면 fileSize 및 덤프 문자열을 확인하십시오.

+0

freopen()은 원자 성명과 비슷합니다. 응용 프로그램이 종료 될 때까지 쓰기가 계속됩니다. 파일 크기가 fs보다 커지면 freopen()을 중지하는 방법을 모르겠습니다. –

+0

로그 파일로 리디렉션하려면 파일을 한 번만 다시 열면됩니까? 그 후 NSLog에서 현재 파일 크기를 확인하십시오. 임계 값보다 작 으면 데이터를 기록하십시오. 그렇지 않으면 함수를 종료하십시오. – DavidN

0

코드는 말합니다 :

을만큼 [fielAttributes 이는 파일 크기] 이 FS 미만으로, freopen을 (...)를 호출 유지한다.

정말 원하는 것입니까? 멈출 다음 FS 문자에 대한 로그 정보를 기록하고 있기 때문에 그 어느 멋진 아니다, 물론

if ([fileAttributes fileSize] < fs) { 
    file = freopen([FILEPATH cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr); 
} 
fwrite(file, "something to log"); 
fclose(file); 

: 난 당신이 뭔가를 선호 할 수도 있다는 추측에는 요. 대신, 당신은 아마 마지막 fs 문자를 보존하려는 것 같습니다. 그렇다면 실용적인 접근법은 단순히 마지막 fs 문자를 새 파일로 복사하고 수시로 이전 파일을 삭제하는 것입니다.