fwrite와 fseek

익명 사용자의 이미지

파일의 특정부분을 열어서
fseek로 해당위치로 간후에
fwrite로 문자열을 쓸려고 했는데, 안돼네요

fread는 fseek의 위치정보에 영향을 받는데
fwrite는 fseek로 끝으로 이동했든, 첨이든 중간이든간에
무조건 끝에다가 순차적으로 데이터를 기록하네요.

open모드는 append모드로 줬습니다.

기존의 파일의 특정부분을 수정할려면
새로 파일을 만들어야하나요?
아님 해당부분에 이동해서 그부분에 write를 하는 방법은 없나요?

익명 사용자의 이미지

append 모드로 쓰기를 열었다면 파일 포인터의 위치는 파일 젤 끝입니다.
(당연하겠죠)

그러한 상황에서 파일 중간만큼 이동해서 쓰기를 원하신다면

일단 파일 젤 앞으로 파일 포인터를 이동하시고(fseek) 다시 원하는 만큼
이동하신다음에 쓰셔야 할겁니다.

추석 즐겁게 보내세요~~

익명 사용자의 이미지

append모드를 준 이유는 w가 들어가면 파일 size가 0으로 초기화되기
때문에 준거고요,
저도 ...님과 같은 생각으로
append( 쓰기도하고, 내용도 않지워지게해야하니 )모드로 열어서
fseek로 파일의 처음으로 이동해서( rewind를 써도 마찬가지 )
fwrite를 쓴것입니다.

이래저래 레퍼런스를 뒤져보니 원래 write는 순차적으로만되고,
특정부분 수정은 불가능한거 같군요.

익명 사용자의 이미지

음.. fopen을 하는 이유(사이즈가 0인..)가 중요하지 않다면

그냥 open을 이용해서 해 보시죠.(물론 제약이 있겠지만)

open->lseek->write->close 로 하심 될듯 한데요..

물론.. 이것은 제약이 있겠지만(외적인..)

파일 중간에 쓰는건 확실히 되거든요.. -_-;;

익명 사용자의 이미지


fopen(filename, "r+");
로 여세여.

man fopen (RMTF -_-;;)해 보시면 아시겠지만,
w로 여시면 파일이 있는 경우 파일을 truncate시킵니다.
append 모드는 의미가 좀 다른데요, 이 모드로 여시면
파일의 맨 끝에다가 쓰는 것입니다.
fseek() 등으로 해서 파일 포인터를 어디에 갖다 놓으시건
상관없이 write가 일어나게 되면 맨 뒷쪽에 쓰게 되어있습니다.
이 모드가 필요한 이유는, 동시에 여러 프로세스에서
파일을 연다면, 내가 아무리 파일 포인터를 맨 끝으로 seek 시켜놓고
쓴다고 하더라도 다른 프로세스가 또 쓸 수 있으므로
자기가 write를 할 때 파일 끝이라는 것을 보장할 수가 없기 때문입니다.
append로 열면 파일정보에 append 모드로 열렸다는 정보가 있습니다.
write 에서는 데이터를 쓰기 전에 파일의 맨 끝으로 옮겨서 씁니다.
write는 atomic한 연산이기 때문에 항상 파일의 맨 끝에 썼다는 것을
보장할 수 있는 것이져..
로그 파일 작성등에 쓰이겠져. 주의할 점은 fprintf()등이
atomic하지 않다는 것입니다. 따라서 snprintf()등의 함수를 불러서
필요한 포메팅을 하신 다음에 write()로 쓰는것이 보다 안정적인
처리를 보장하겠져..

파일 중간에 쓰실려면 r+ 등 *update*모드를 사용하세여.

댓글 달기

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