fopen +r 모드로 갱신시에...

prox의 이미지

fopen으로 파일을 다음과 같이 열고

fp = fopen("aaa", "r+");

c = fgetc(fp);

c += 2;

fputc(c, fp);

fclose(fp);

를 하면 (즉, r+로 갱신 모드로 열고 fgetc로 하나 읽은 후 fputc로 하나 쓰면) 데이터가 기록이 안됩니다.

이와 반대로 fputc를 먼저 호출하고, fgetc를 하면 이상한 위치의 값을 읽어옵니다.

fputc와 fgetc 사이에 fseek가 있을 경우에는 정상 동작을 합니다. 이때 이상한 점은 fseek 의 값이 +든 -든 상관이 없는 것입니다. 즉 fputc와 fgetc가 연달아서 호출이 되면 둘중 하나가 오동작을 하고 fseek를 중간에 써주면 둘다 정상동작을 하는 것인데요.

그렇다라는 것은 fputc와 fgetc가 인자로 넘어가는 fp에 대해 내부에서 무언가 꼬이는 것 같은데요 그런데 또 웃긴것은 ftell로 현재 포인터를 읽어보면(물론 파일 포인터야 fp 하나만 사용하니까요) fputc 이후건 fgetc이후건 fp의 값은 꾸준히 1씩 증가한다는 것이죠.

예를 들어 파일의 내용이 ABCDEFGHIJK... 라면
fgetc - A를 읽어옴, fp = 1 (0에서 1증가)
fgetc - B를 읽어옴, fp = 2
fgetc - C를 읽어옴, fp = 3
C를 교체하기 위해 fseek -1, fp = 2
fputc - C를 X로 교체, fp = 3 (2에서 1증가)
fgetc - D를 읽어오기를 기대함 그러나 B를 읽어옴, fp = 4
fgetc - E를 읽어오기를 기대함 그러나 C를 읽어옴, fp = 5
fgetc - F를 읽어오기를 기대함 그러나 D를 읽어옴, fp = 6

위와 같습니다. 아직 fputc를 한 내용이 업데이트 되지 않은 상태로 읽어오는 것이지요. 그런데 fp는 여전히 증가하고 있습니다. 재미있지 않나요? :)

질문이 조금 두서가 없습니다만, 혹시 알고 계시거나 스치는 생각이 있는 분들은 리플 달아주시면 감사하겠습니다.

P.S. 원래 목적은 r+ 모드로 파일을 읽은 후 파일 안의 내용을 변경하기 위함이었습니다.

댓글 달기

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