C언어로 파일을 열어서 특정 문자열을 찾은 뒤 그 문자를 빼고 다시 저장하는 것을 어떻게 구현해야 하나요?
예) 원래 파일의 내용 : aaaaaaaaaaaakldpaaaaaaaaaaaa kldp란 문자열을 빼고 aaaaaaaaaaaaaaaaaaaaaaaa를 저장
성능 상관없이 단순무식노가다 코드로 짠다면 대략
prev_ptr = start_of_full_text; while( (current_ptr = strstr(full_text,find_text)) != NULL ) { copy_to_file( prev_ptr, current_ptr ); prev_ptr = current_ptr + strlen( find_text ); }
식으로 하면 되지 않을까요?
그런데 파일에서도 똑같이 하면 되나요? 10kb정도 되는 바이너리 파일인데
바이너리라면 NULL 때문에 strstr 같은 함수는 쓸 수 없을것 같은데요?
그냥 리니어서치를 해야 하려나요..;
ptr = start_of_file; while( 파일의 끝에 도달할때 까지 ) { while( 특정 크기의 블럭을 파일에서 읽어와서 ) { ptr = start_of_block; while( ptr가 블럭의 끝에 도달할 때 까지 ) { if( memcmp( ptr, 찾는내용, length_of_찾는내용 ) == 0 ) ptr += 찾는내용 // 파일에 안쓰고 skip else 파일에 ptr 가 가리키는 1바이트 쓰고 ptr++; } } }
이런식으로 1바이트씩 움직이면서 비교하면 되지 싶습니다.
단 이때 블럭단위로 읽기 때문에 찾는 패턴이 블럭과 블럭 사이에서 잘릴 경우를 대비하여 다음 블럭을 읽어들일시에 찾는 패턴의 길이만큼 되돌아가서 읽는부분 등이 필요하지 싶네요.
(파일이 길지 않다면 그냥 한방에 읽어서 하는것도 나쁘지 않겠죠;;)
게다가..바이너리라면..
메모리로 읽어 들이세요 1M 도 아닌데..뭐 10kb 정도면 ..
메모리에서 처리 하셔서 그대로 다시 파일에 쓰시면 될듯
gchar *str, **strs;
str = g_strdup("aaaaaaaaaaaakldpaaaaaaaaaaaa");
strs = g_strsplit(str, "kldp", -1); str = g_strjoinv("", strs);
g_strfreev(strs); g_free(str);
동작 하려나요 =.=;;
텍스트 포맷에 대한 자세한 정보
<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]
성능 상관없이
성능 상관없이 단순무식노가다 코드로 짠다면 대략
식으로 하면 되지 않을까요?
그런데 파일에서도
그런데 파일에서도 똑같이 하면 되나요? 10kb정도 되는 바이너리 파일인데
바이너리라면 NULL
바이너리라면 NULL 때문에 strstr 같은 함수는 쓸 수 없을것 같은데요?
그냥 리니어서치를 해야 하려나요..;
이런식으로 1바이트씩 움직이면서 비교하면 되지 싶습니다.
단 이때 블럭단위로 읽기 때문에 찾는 패턴이 블럭과 블럭 사이에서 잘릴 경우를 대비하여 다음 블럭을 읽어들일시에 찾는 패턴의 길이만큼 되돌아가서 읽는부분 등이 필요하지 싶네요.
(파일이 길지 않다면 그냥 한방에 읽어서 하는것도 나쁘지 않겠죠;;)
10kb 정도라면.
게다가..바이너리라면..
메모리로 읽어 들이세요 1M 도 아닌데..뭐 10kb 정도면 ..
메모리에서 처리 하셔서 그대로 다시 파일에 쓰시면 될듯
gchar *str, **strs; str =
gchar *str, **strs;
str = g_strdup("aaaaaaaaaaaakldpaaaaaaaaaaaa");
strs = g_strsplit(str, "kldp", -1);
str = g_strjoinv("", strs);
g_strfreev(strs);
g_free(str);
동작 하려나요 =.=;;
댓글 달기