[Q] C언어로, 텍스트 파일을 지정해서, 파일내의 특정 라인을 변경하고 싶습니다.

cs010101의 이미지

C언어를 사용할때,

a.txt라는 파일이 있을 때,

a.txt파일의 10번째 라인만 변경하거나 추가하고 싶습니다.

어떻게 해야하나요?

오호라의 이미지

$> change a.out 10 before after

#include "stdlib"
 
int main( int argc, char* argv[] )
{
    char exec_buf[1024] = { 0, };
 
    sprintf( exec_buf, "sed -n '%d,%dp' %s | sed -e 's/%s/%s/g'", argv[1], argv[2], argv[3], argv[4] );
 
    system( exec_buf );
 
    return 0;
}

Hello World.

cs010101의 이미지

sed -n '%d,%dp' %s | sed -e 's/%s/%s/g'

이 부분 좀 설명해 주세요......

-----------------------------------------------
어머니,
그 이름만으로도 우리는 풍요로와 집니다.

효도합시다......
-----------------------------------------------

neogeo의 이미지

sed 라는 외부 툴을 이용하여 바꿔치는 것이므로 ( windows 계열이면 cygwin 혹은 gnu tools for win 을 깔아보셔야 쓸 수 있을겁니다. )

순수하게 C 언어로 했다고 보기는 어려울 것입니다.

저 부분은 sed 라는 tool 의 매뉴얼을 살펴보시면 쉽게 아실 수 있습니다.

원하시는 부분은 생각보다 복잡할 수 있습니다.

특정 라인을 new line 을 기준으로 얻어내셔서 ( 혹은 carriage return ) fp 를 가져다 놓은 후,

만약 내용이 늘어날 수 있다면 fp 의 다음 new line 이후의 모든 내용을 다시 기록하셔야 하므로 이를 처리할 방법이 필요할 것입니다. ( 예를 들어 1 byte 만큼 특정 라인에 내용이 바뀌면서 길어진다면, 다음 줄 부터는 모두 1바이트씩 뒤로 밀려서 다시 기록되어야 할 테니까요. )

물론 내용이 줄어드는 경우도 마찬가지입니다.

내용이 대체되면서 길이가 변하지 않는 다면 비교적 쉽게 처리하실 수 있습니다.

일단 원하는 라인을 얻는 방법은 fp 를 이동시켜가며 new line 과 carriage return 의 개수를 세어보는 방법, 혹은 fgets 를 이용하여 ( ascii 라는 가정하에 ) 한줄씩 받아보는 방법도 있겠지요.

아마 fgets 가 좀 더 쉬운 방법이 될 것이라 생각합니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

오호라의 이미지

1. fgets() or fopen(), fread()
> stdin으로 문자열을 입력을 받는다, 또는 파일로부터 입력을 받는다.

2. line_ptr = strchr( buf, '\n' ) or line_ptr = strchr( buf, '\r' )
> 라인피드 또는 커리지리턴을 찾는다. n - 1 번 호출한다. n은 10번.
> 9번째 라인과 11번째라인 두 군데의 포인터를 찾아 놓는다. 왜냐? 10번째 라인길이가 얼마인지 모르기 때문에...

3. strdup()
> 11번째라인부터의 내용을 다른곳으로 복사해놓는다.

4. write(), memset(), strcpy()
> 10번째라인에 새로운 내용을 덮어쓴다.

5. write(), memset(), strcpy()
> 아까 카피해둔 11번째 라인의 내용을 뒤이어 덮어쓴다.

6. 끝.

Hello World.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.