[질문] 이런 알고리즘은 어떻게 구현 할까요?

익명 사용자의 이미지

어떤 데몬의 로그에 계속 로그가 기록이 되는데 특정 라인수를 넘어가지
않게 하는 소스입니다. ( 구현은 C 입니다. )

예를 들어 5 라인이 제한이라고 하면.

111
222
333
444
555

라는 파일에 666 이 기록되면

222
333
444
555
666 이런 식으로 되어야 겠죠..

제가 구현한 소스가 있긴 한데, 좀 난잡하고 테스트는 잘 되다가 데몬과
연결시켜 사용하니까 잘 안돼네요.. ㅠㅠ
소스가 복잡하다 보니 분석도 잘 안되고...
어떤 간단 명료한 방법이 있을것 같은데 궁금합니다.

아래는 제가 짠 소스입니다.

// 설 명 로그 파일이 항상 10 라인 이상 넘지 않게 만들기

#include

int main(void)
{
FILE *input, *output; // 읽는 파일, 쓰는 파일 파일 포인터.
char c;
int i = 0;
int n = 0;
int m;

input = fopen("aaa", "r");
output = fopen("bbb", "w");

if(input == NULL)
{
exit(1);
}

if(output == NULL)
{
exit(1);
}

while(( c = fgetc(input)) != EOF) // 파일을 한글자씩 끝까지 읽어서
{
++n; // 한문자에 하나씩 올라감

if( c == '\n') // new line 을 만나면
{
m = n; // 문자수를 저장
}

if( n == ( m + 1 )) // 저장된 문자수 ( 뉴라인 ) 다음 부터
{
++i; // i 증가

n = 0; // 다시 처음 부터
}

if( i >= 1 )
{
fputc(c, output);
}
else
{

}
}

fclose(output);
fclose(input);

printf("Total number of lines = %d\n", i);
printf("n = %d\n", n);
}

익명 사용자의 이미지


술취했지만.. 지나가다.. 몇자 적어봅니다. ㅡ,.ㅡ;;;

소스는 안봐서 ㅡ,.ㅡ; 모르겠고..

님의 의도를 짐작컨데.. 님이 구현하려는 방법보다는

차라리 새로운 파일을 작성하여 로그를 남기는게 좋을듯하군요..

예를들어 xxxxxxx_20020917.log 다음날 xxxxxxx_20020918.log .......

이런식으로.. 그리고 오래(한달전쯤)된것은 자동으로 지워지게....

님이 생각하신 방법은 로그 한줄 남길때만다 매번 파일전체를 새로

기록하는수 밖에 없습니다. 시스템에 쓸데 없는 무리를 주게 됩니다.

익명 사용자의 이미지

감사합니다

그런 방법이 있었군요...
근데 제가 벌써 다른 부분은 다 만들어 놓고, 그 부분 (로그파일 제한)
만 나중에 할려고 나눴거든요..

그래서 지금에 와서 바꾼다는 것은 좀 무리가 있네요.. ㅎㅎ

ps. 요즘 참 술먹기 좋은 계절이죠.. 날씨도 선선하고..

익명 사용자의 이미지

일단 로그를 기록하려는 시점에서 로그파일의 라인수를 셈하고,

제한 라인(10줄?)이 넘으면 처음에 한줄만 삭제하고 나머지 9줄에 새로운
한줄을 넣으면 되는거군요.

그렇다면

제한 라인을 넘었을 경우에 다시 로그파일을 열어서 첫번째 줄은 건너뀌
고 나머지 9줄을 새로운 파일에 쓴 다음에 마지막 로그 내용을 덧붙인 후
에 기존 파일을 지우고 새로운 파일의 이름을 바꾸면 되겠군요.

이게 제 생각으로는 젤 쉬운 방법 같은데,

당연히 시스템에 무리가 많이 가겠습니다. 속도 문제도 있겠고..

아니면..

모두 벡터를 사용해서 밀어 넣은 후에 기존 파일을 몽땅 지우고 해당하는
것만 파일로 새로쓰는 방법도 있겠구만요.

그것도 아니라면..

그냥 char line[11][256]; 으로 잡고 하시죠.(단지 10줄인데 자료구조니
뭐니 필요하겠슴까..)

길은 여러갠데.. 솔직히 성능에는 자신 없군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.