파일입출력...

samdochen의 이미지

a라는 바이너리 파일이 있다고 했을때요..

이 파일내에서 한 줄만 삭제할수 있는 방법이 없을까요??

파일의 맨 끝에 한줄을 추가할 수는 있겠는데,

삭제는 잘 못하겠네요..

monpetit의 이미지

한줄이라는 의미는 텍스트 파일의 경우에 한하는 게 아닐까요?

issue00의 이미지

바이너리 파일???

항상 깨어있어라 ~~~

samdochen의 이미지

monpetit wrote:
한줄이라는 의미는 텍스트 파일의 경우에 한하는 게 아닐까요?

그렇담.. 말을 바꾸어서.

특정 바이트에 직접 접근해서 몇바이트만 삭제할수 있는 방법은 없나요???

monpetit의 이미지

여러 다른 방법이 있을지 모르겠지만 당장 생각나는 것은, 파일이 자료구조로 되어 있는 게 아니라면, 즉 스트림이라면 파일을 열어서 처음부터 끝까지 읽어가면서 삭제하고 싶은 부분만 건너뛰면 될 것 같은데요...

예를 들면
1. 파일 A를 열고 (읽기)
2. 파일 B를 열고 (쓰기)
3. 파일 A에서 바이트를 읽어 B에 복사하면서
4. 삭제하고 싶은 부분을 건너뛰면
원하는 내용이 B에 들어가지 않겠습니까. :wink:

pynoos의 이미지

inode를 유지하시렵니까? 아니면 이름만 새로이 작성되길 원하십니까..

inode를 유지하려면, block 단위로 읽고 버퍼에서 쉬프트를 한다음 저장하는 방법을 사용해야겠군요.

그리고 맨 마지막에는 truncate 함수 한번 사용해야하구요.

samdochen의 이미지

답변 정말 감사합니다...^^

방법이 있군요..역시 허접한 저의 실력에 고개가 숙연해집니다..

여기서 많이 배우고 있긴하지만..

그래도 역시 초보라서..

고수님들의 말을 듣고도 감이 좀 안 잡히거든요..

truncate함수를 어떻게 사용하는지도 잘 모르겠거든요.

죄송하지만.. 좀 더 구체적으로 설명부탁드릴께요...^^

pynoos의 이미지

음, inode를 유지한다는 것은, 같은 파일의 내용을 편집하는 것이고, 유지하지 않는 다는 것은, 다른 파일로 원하는 부분만 복사한뒤 원본을 삭제하고 원본과 이름을 같도록 만드는 것입니다. 이것이 쉽죠. (temporary 파일만 충분하면요.)

truncate함수는 단지 파일의 크기를 그만큼으로 줄이는 일을 합니다. 중간을 삭제하려고 뒷부분을 앞으로 끌어당기면 뒤는 잘라야하지 않습니까..?

truncate함수의 정의되지 않은 기능중의 하나는 원래 길이보다 길게 잘랐을때 파일 크기가 늘어나느냐는 것인데, 주의하여 사용하세요.

운형의 이미지

로직과, API가 알려졌다면, 나머지는 헤더 파일과 메뉴얼 페이지 보기네요.

int truncate(const char *path, off_t length);

int ftruncate(int fd, off_t length);

해당 파일을 length길이로 자르는 거구요.
length가 파일 크기보다 작은 경우, 파일 처음부터 length만큼 자르고 그 이후 데이터는 전부 버리고, 파일을 생성합니다. length가 파일 보다 큰경우, 원래 파일에 length - filesize 만큼을 0으로 채워 파일을 만든다고

메뉴얼 페이지에

나와있습니다.

Do you think that's the air you are breathing now?

pynoos의 이미지

매뉴얼은, 파일을 원본보다 더 크게 자른다(?)고 할 때, 정의되어 있지 않다고 나와있으며,
정의되지 않은 행동은 그대로이거나 늘어나거나 인데, 늘어날 경우는 0으로 채워서 늘어난다입니다.

아뭏든 정의되어 있지 않은데, 제가 확인한 Linux, Solaris, AIX, HPUX에서는 모두 늘어납니다 :)

pynoos의 이미지

저 행동이... OS 일지, File System일지는 생각해보지는 않았습니다. File System 행동이겠죠?

운형의 이미지

리눅스에서는 0으로 채워지는데요...

테스트 해봤습니다.

페도라 코어 1.0에서 물론 os설치시 같이 설치된 라이브러리를 사용했구요.

다른 플랫폼에서는 테스트 못해봤습니다.

Do you think that's the air you are breathing now?

sangwoo의 이미지

운형 wrote:
리눅스에서는 0으로 채워지는데요...

테스트 해봤습니다.

페도라 코어 1.0에서 물론 os설치시 같이 설치된 라이브러리를 사용했구요.

다른 플랫폼에서는 테스트 못해봤습니다.

FreeBSD 5.2-current 입니다. 역시 0으로 채워서 늘어나네요.

DESCRIPTION
     The truncate() system call causes the file named by path or referenced by
     fd to be truncated or extended to length bytes in size.  If the file was
     larger than this size, the extra data is lost.  If the file was smaller
     than this size, it will be extended as if by writing bytes with the value
     zero.  With ftruncate(), the file must be open for writing.

추가합니다. POSIX에서는 늘어나고 0으로 채워져야 한다고 이야기하고 있네요.
47459-47460행입니다.

47456 DESCRIPTION
47457 The truncate( ) function shall cause the regular file named by path to have a size which shall be
47458 equal to length bytes.
47459 If the file previously was larger than length, the extra data is discarded. If the file was previously
47460 shorter than length, its size is increased, and the extended area appears as if it were zero-filled.
47461 The application shall ensure that the process has write permission for the file.
47462 If the request would cause the file size to exceed the soft file size limit for the process, the
47463 request shall fail and the implementation shall generate the SIGXFSZ signal for the process.
47464 This function shall not modify the file offset for any open file descriptions associated with the
47465 file. Upon successful completion, if the file size is changed, this function shall mark for update
47466 the st_ctime and st_mtime fields of the file, and the S_ISUID and S_ISGID bits of the file mode
47467 may be cleared.

참고로 ftruncate()는 0으로 채운 것처럼 늘어나거나, error를 돌려줘야 한다고 되어 있더군요.

----
Let's shut up and code.

댓글 달기

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