c++에서 fopen fclose를 반복적으로 할때 좋은 방법은 어떤걸까요?

허재성의 이미지

c++이고
프로그램 중에 특정 파일을 주기적으로 읽어야 하는데요.
현재는 함수 안에서 fopen, fclose를 하고 있습니다.

1. int* fp를 멤버 변수로 만들고 생성자에서 fopen 한번해주고 소멸자에서 fclose 한번 해주는게 좋을까요?
아니면
2. int* fp를 지역변수로 만들고 함수에서 fopen, fclose를 해주는것이 나을까요?

dalant019의 이미지

지역 변수로 하셔도 프로그래밍에 문제가 없다면 그렇게 하는 게 좋을 것 같습니다. 만약 동일한 파일(스트림)을 다른 함수(다른 scope)에서 사용해야 한다면 멤버로 고려해보셔야 겠죠.^^(이때도 정적 변수로 할건지 멤버로 할 건지 신경써야 겠지요.)

만약 performance 때문에 그러신 거라면 "지역 변수 아니면 객체 멤버?" 이 선택의 문제 보단 더 근본적인 것을 고려해야 될 것 같습니다.

엉뚱한 데를 긁고 있는 거라면 죄송~
-------------------
한 사람이 더 행복해지는 세상을 위하여

phonon의 이미지

목적 화일의 접근에 대한 고려를 하시기 바랍니다.
다른 프로세스에서 동일한 화일에 동시에 쓰기나 읽기를 하는지
그리고, fopen을 사용할 경우의 에러처리에 문제가 없는지 등.

매번 fopen를 호출하는 것이 속도적인 측면에서 큰 차이가 없다고 생각듭니다.
그리고, 동시 접근이 발생할 것 같으면 mutex를 사용해서 충돌방지를 하세요.

제목에서 ifsream를 사용하시라고 한 이유는 fopen를 아래와 같이 사용하셔야 할 경우가 있습니다.
for ( ; ; ) {
fin = fopen("/home/test/check.log","r");
if ( fin != NULL || errno != EINTR ) {
break;
}
}

C++에서 꼭 필요한 C의 함수이외는 자체 함수를 사용하시는 것이 가독성이나 유지보수에 좋다고 하더군요.(전 항상 동의는 못 합니다만 ^^;)

winner의 이미지

fstream 과 FILE * 의 차이는 어떤지 궁금하네요.

이 경우는 상관없는 이야기이긴 한 것 같습니다만...

phonon의 이미지

file입출력 관련함수들은 다른 API들에 비해서 상당히 느리며, virtual function call를 한두번 더 한다고 더 느리다고는 생각이 안 듭니다.

다만 화일의 크기, 읽기의 횟수, 버퍼의 사이즈들이 속도를 좌우한다고 봅니다.
C++ 입출력 API는 이미 최적화가 되어 있는 상태라고 보시면 됩니다.

혹시 실시간으로 나노단위까지 컨트롤해야 한다면 C나 어셈으로 할 수 밖에 없지만요.
그 외에는 그런 함수들을 적재적소에 사용하는 사람의 능력이 아닐까요.

댓글 달기

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