fopen() 함수에서 읽기쓰기 모드를 어떨때 사용하나요?

taeyeung의 이미지

저는 평상시 파일을 열때 읽기 모드 only, 쓰기 모드 only, 또는

추가 모드로만 작업을 했습니다.

근데 파일을 읽기 쓰기 모드로 여는 경우가 있더군요

예를 들면 fopen( "aa.txt", "r+t"); ( windows ) 처럼요.

제가 궁금한 것은 읽기 쓰기 모드로 열어서 작업을 한다는 게 어떤건가요?

파일을 열어서 일부는 읽고 일부는 쓴다는 의미인가요?

기존의 파일을 열어서 수정한다는 의미인가요?

아시는 분 시원하게 설명 부탁드립니다.

예제를 추가해 주시면 더욱 고맙고요.

codebank의 이미지

보통 파일을 열때는 읽기전용이나 쓰기전용으로 많이들 사용을 합니다.
하지만 때로는 하나의 파일을 이용해서 읽고 쓰기가 가능해야 할때가 있습니다.
물론 LOG파일을 작성할 때는 무조건 쓰기나 무조거 읽기만을 하겠지만요...
현재 많이 사용되고 있는 DATABASE라는 엄청 덩치큰 프로그램이 있을 겁니다.
내부적으로 읽기 쓰기를 할때 파일에 그 자료값을 남기거나 읽어들여야하죠.
간단한 예로 C로 만든 데이터베이스란 책이 있습니다.
데이터베이스를 구현하는데 그 자료는 파일에 적혀지게 되겠죠.
보통은 open, read, write를 많이 사용합니다만 때로는 fopen, fread, fwrite
를 쓰기도합니다. 현재로서는 그 구분이 명확하지 않지만 처음에는 이 구분이
어느정도 명확했답니다.
즉, 순차적인 흐름에 이용할 때는 fopen을 이용하고 random한 자료를 읽고
쓸때는 open 쪽 함수를 많이 사용을 했습니다.
현재는 그 구분도 어느정도 의미를 잃었지만...
fopen의 특이한점은 \n로 그 구분이 지어진다는 것이죠.
즉, open은 문자열의 어떠한 구성이라도 있는 그대로 파일에 적어주는반면에
fopen은 \r\n을 \n로 구분지어서 파일에 쓰는 경향이 있습니다.
프로그램할때 많은 주의점이 요구되는 부분이기도 합니다.

또한가지...
쓰기모드로 파일을 열면 디폴트로 파일의 모든 내용을 지우게 되어있습니다.
'+'를 넣어서 이점을 방지한다고는 하지만 가끔 호환이 안되는 시스템도 있는
것으로 알고 있고 읽고 쓰는 모드인 'a'를 이용할 경우 그 포인터가 파일의 마
지막 부분을 가리키게 됩니다. 'r+'인 경우에는 파일의 시작부분을 가리키죠.
fseek를 이용해서 파일처음으로 돌아가도 되지만 단순한 치환같은 걸 이용
할때는 (길이가 같을때...) 'r+'가 더 효율적이지 않나 싶네요.
어느 프로그램에서 그런형태로 사용했는지 모르겠지만 프로그램의 로직을
이해하다보면 왜 그런식으로 썼는지를 알 수 있을 겁니다.

자세한 설명이 되지는 못한것 같네요. :-)

------------------------------
좋은 하루 되세요.

pynoos의 이미지

아랫것(?)들 얘기로는 device에 등록된 write, read 함수를
모두 사용할 수 있는 권한으로 요청한다는 얘기지요. 커널이 보기에
파일 권한이 현재 프로세스의 권한내에 있을 때, 그 열기 요청은 성공합니다.

윗것(?)들 얘기로는 한 번 열어서 file position을 바꿔가며, 읽기쓰기를
모두 하겠다는 것이지요.

대개 text mode로는 잘 하지 않고, binary mode로 하며,
그 예로는, 통계 저장, 상태관리, DB file 등이 있겠습니다.

읽기 쓰기 모드로 열어서 편집후 저장하는 것과,
읽기 모드로 열고 읽은 뒤 메모리상에서 편집후
다른 이름으로 저장후 원본 파일과 교체하는 것은
크게 다릅니다.

그것은 disk 상의 inode값이 유지되는지의 여부가 달라지므로,
만일 두 개 이상의 프로세스가 작업하는 환경이라면, 고려해야할 일이
있습니다.

taeyeung의 이미지

임베디드 시스템에서 개발을 하다 보니 fopen() 함수를 만들어야

할 때도 있네요. 답변 감사합니다.

pynoos의 이미지

사족이긴하지만...

fopen은 c library 함수이고 open 은 kernel 쪽 함수이지요

fopen이 없는 상황에서 굳이 fopen을 구현하실 모양이라는 것은...

f~ 계열 함수를 다 만드신다는 얘기 같이 들립니다만.......

걍... 참고 open, write/read 를 쓰심이.... ^^

댓글 달기

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