[C]파일스트림의 R/W가능 여부를 검사하는 함수가 있나요?

jonyon의 이미지

프로젝트중에 FILE객체를 인자로 받아서 파일 내부를 검색하는 함수를 만들려고 합니다.

long filesearch(FILE * file, char * string);
이런 함수가 될 것 같은데, 이렇게 할때 받아온 파일스트림이 적어도 읽기 모드는 가지고 있어야하잖아요.
read가 불가능하다면 에러값을 내놓도록 프로그래밍 하고싶어서 여러가지로 찾아보았습니다.

그래서 발견한건
fcntl(fd,F_GETFL)입니다.

그런데 POSIX 함수라서 윈도에서는 못써먹고 있습니다...
리눅스나 윈도나 둘 다 작동 가능하게 만드는게 목표인데 혹시 이런 표준함수 없을까요?
없다면 대신할 방법이라도...

익명 사용자의 이미지

1. 수동적인 방법.

실제로 그 file에 대해 읽기 함수를 호출해 보면 됩니다. 어차피 읽을 파일일 테니까요.
읽기가 성공하면 애초에 읽기 모드가 있는 것이고, 실패하면 EOF 등을 반환할 텐데, feof나 ferror 등의 함수를 이용하면 이게 진짜 파일의 끝인지 에러가 난 것인지를 확인할 수 있습니다.

2. 능동적인 방법

주어진 file에 대해 freopen을 호출합니다. filename은 NULL로, open mode에는 읽기 모드를 주면 되겠죠.
그러면 이전에 열렸던 파일 모드와 상관 없이 읽기 모드로 새로 열립니다. 파일 퍼미션 등의 이유로 실패할 수도 있겠지만요.

그 외에도 뭐, "읽기 모드로 파일을 열어서 넘겨주는 건 함수를 호출하는 쪽의 책임으로 한다"고 문서에 명시하고 배를 째거나,
아니면 애초에 파일 포인터가 아닌 파일 이름을 받아서 filesearch 함수가 파일을 직접 여는 방법도 있겠습니다.

jonyon의 이미지

ㅋㅋㅋㅋㅋ 배를 짼다니

일단 수동적인 방법이 마음에 듭니다. 에러를 가정하고 호출한다니 석연찮긴 하지만 뭐 별수 없네요. 감사합니다.

파일 이름을 받는다는건 생각 못해봤네요. 이것도 괜찮은것 같습니다.

jick의 이미지

배를 째되, 파일에 대한 모든 조작 이후 에러를 검사해서 에러일 경우 에러 코드를 (-1?) 리턴해주고 "니가 원하는 에러는 errno에 있다" 해주면 됩니다. 시스템에서 제공하는 수많은 함수들이 이런 식으로 동작합니다.

윈도우즈는 잘 모르겠지만 리눅스라면 어차피 fread가 가능한 파일이라도 fseek가 된다는 보장이 없습니다. (예를 들면 pipe라든지, socket이라든지...) 그러니까 뭘 하더라도 시스템 함수를 하나하나 부를 때마다 에러 체크는 어차피 해야 하고, 어차피 에러 체크를 다 할 거면 굳이 함수를 시작할 때 에러 체크를 또 한다고 얻을 게 별로 없죠.

라스코니의 이미지

fstat () 라는 좋은 함수가 있습니다.

st_mode & S_IRUSR
st_mode & S_IWUSR
st_mode & S_IXUSR

윈도우에도 포팅되어 있는지 확인해 보세요.

chanik의 이미지

질문의 내용은 넘겨받은 FILE 개체가 읽기가 가능한 모드
(O_RDONLY 또는 O_RDWR)로 열린 것인지를 알아내고자 하는 것인데,
fstat()은 접근대상이 되는 파일에 대해 파일시스템상에 새겨진 접근권한을
알아내는 함수이므로 상황에 맞지 않는 것 같습니다.

파일의 접근권한에 S_IRUSR 비트가 켜져있더라도
이를 열 때 읽기가 불가능한 쓰기전용 모드로 열 수도 있으므로
질문자께서는 이런 상황을 판별할 방법을 찾고 있는 것 같습니다.

라스코니의 이미지

아 그렇군요...
fcntl() 함수를 대체할 윈도우 함수를 찾는 거였군요.
구글 서치를 해보니 _stat(), _wstat() 함수들이 나오는데 이걸로 안되는가요?

댓글 달기

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