C++ 표준 라이브러리를 이용한 프로그래밍...

zelon의 이미지

c++ 의 표준 라이브러리 프로그래밍을 문득 공부해보고 싶어졌습니다. 윈도우 프로그래밍에 익숙하던 제게 문득 이 생각이 들더군요. 현재 소스 코드는 플랫폼에 너무 종속적이다...

그런데 말이죠. 이상하게 C++ 표준 라이브러리를 쓰는 건 iostream 이랑 stl 종류 밖에 안 쓰고 있었습니다. 파일 입출력은 C 의 fopen 등으로 처리하고 말이죠. fstream 도 학교 과제할 때나 쓰지 제대로 써본적이 없었네요. fstream 의 getline 과 >>, << 만 쓰고...

어느 스터디 시간에 - Modern C++ 을 보고 있었습니다 - 다른 분들한테 C++ 로 어떻게 파일 스트림을 다루냐고 하니, 제대로 아시는 분들이 없더라구요. 다들 fopen 으로 다루는게 편하신 듯...

C++ 에도 파일을 열고 닫고, 이런 것에서 더 나아가 파일을 찾고, 지우는 등의 라이브러리가 있나요? 물론 표준이면 좋겠습니다.

그리고 관련 서적을 추천해주세요 ^^

익명 사용자의 이미지

cout cin으로도 되는데요... 그거 말고도 많지만.

zelon의 이미지

cout, cin 으로 파일을 지울 수 있나요? ;;

-----------------------------------------------------------------------
GPL 오픈소스 윈도우용 이미지 뷰어 ZViewer - http://zviewer.wimy.com
블로그 : http://blog.wimy.com

feanor의 이미지

파일 입출력은 당연히 #include <fstream> 으로 하지 않나요?

ifstream, ofstream 객체를 만든 뒤에는 cout, cin과 똑같이 쓰면 됩니다.

--feanor

zelon의 이미지

^^;; 네.. 그렇긴 한데 그외의 다른 것들 말이죠. 예를 들자면 다음과 같은 것이 혹시 표준 라이브러리에 있나해서요.

 std::file::delete("a.tmp");

 std::file::movefile("a.tmp", "b.tmp");

위와 같이 ... copy(), getfilesize() 등등이 있을까해서요. 물론 외부 라이브러리를 쓰거나, 직접 fstream 을 이용해서 함수를 만들면 되지만, 표준에 있나해서요. 제가 linkedlist 를 만들지 않고 stl 을 쓰는 것처럼요 ^^

-----------------------------------------------------------------------
GPL 오픈소스 윈도우용 이미지 뷰어 ZViewer - http://zviewer.wimy.com
블로그 : http://blog.wimy.com

advanced의 이미지

zelon wrote:
^^;; 네.. 그렇긴 한데 그외의 다른 것들 말이죠. 예를 들자면 다음과 같은 것이 혹시 표준 라이브러리에 있나해서요.

 std::file::delete("a.tmp");

 std::file::movefile("a.tmp", "b.tmp");

위와 같이 ... copy(), getfilesize() 등등이 있을까해서요. 물론 외부 라이브러리를 쓰거나, 직접 fstream 을 이용해서 함수를 만들면 되지만, 표준에 있나해서요. 제가 linkedlist 를 만들지 않고 stl 을 쓰는 것처럼요 ^^

파일 지우거나, 이동등은 플랫폼에 의존적인것이기 때문에
어쩔 수 없이 system call 을 사용해야 하는것 같습니다

C++로 작성한다고 해도 unlink() 나 rename() 등등을 써야 겠지요

zelon의 이미지

흐음... 그런가요. 시스템 의존적이라... 그것 참 아쉽네요^^;;; 그렇다면 C++ 로 저런 처리들은 소스 차원에서 플랫폼에 독립적인 코드를 만들기가 쉽지 않겠네요. #ifdef 를 통해서 밖에 할 수 없겠네요.

자바로는 저런 것이 가능한데, C++ 도 저런 클래스들이 표준으로 올라오면 좋겠습니다. :wink:

-----------------------------------------------------------------------
GPL 오픈소스 윈도우용 이미지 뷰어 ZViewer - http://zviewer.wimy.com
블로그 : http://blog.wimy.com

ㅡ,.ㅡ;;의 이미지

zelon wrote:
흐음... 그런가요. 시스템 의존적이라... 그것 참 아쉽네요^^;;; 그렇다면 C++ 로 저런 처리들은 소스 차원에서 플랫폼에 독립적인 코드를 만들기가 쉽지 않겠네요. #ifdef 를 통해서 밖에 할 수 없겠네요.

자바로는 저런 것이 가능한데, C++ 도 저런 클래스들이 표준으로 올라오면 좋겠습니다. :wink:

여행을 가려는데 C여행사는 각나라의 음식은 그나라의 메뉴를 보고 시키도록하고있고
J여행사는 음식을 항상 동일한것만 시키도록 고정시키고 있었다.

물론나는 C여행사가 당연하다고본다.


----------------------------------------------------------------------------

zelon의 이미지

ㅡ,.ㅡ;; wrote:
zelon wrote:
흐음... 그런가요. 시스템 의존적이라... 그것 참 아쉽네요^^;;; 그렇다면 C++ 로 저런 처리들은 소스 차원에서 플랫폼에 독립적인 코드를 만들기가 쉽지 않겠네요. #ifdef 를 통해서 밖에 할 수 없겠네요.

자바로는 저런 것이 가능한데, C++ 도 저런 클래스들이 표준으로 올라오면 좋겠습니다. :wink:

여행을 가려는데 C여행사는 각나라의 음식은 그나라의 메뉴를 보고 시키도록하고있고
J여행사는 음식을 항상 동일한것만 시키도록 고정시키고 있었다.

물론나는 C여행사가 당연하다고본다.

하지만 J 여행사에서 어떤 나라를 가던지, "싸고 먹을 만한 음식", "비싸지만 매우 맛있는 음식", "가장 인기 좋은 음식", ... 등등으로 패키지를 잘 준비한다면 더욱 환영받지 않을까요? ^^ 적어도 여행객들이 처음 가는 나라라면 훨씬 J 여행사를 선호하겠죠. 물론 고른다는 즐거움은 있겠지만 어떤 음식인지 일일이 확인하는 것과 이상한 음식이 나왔을 때의 당혹감이 없을 테니까요. 장단점이 있겠죠.

그래서 STL 같은 것도 비슷한 맥락 위에 있는게 아닐까요. 그리고 요즘 추세도 CBD 니 이런쪽으로 가는 것도 마찬가지겠죠. 일일이 만드는데는 그만큼 댓가가 들어가니까요.

-----------------------------------------------------------------------
GPL 오픈소스 윈도우용 이미지 뷰어 ZViewer - http://zviewer.wimy.com
블로그 : http://blog.wimy.com

익명 사용자의 이미지

같은 C함수라도 printf, scanf, 같은 함수들은 ISO에서 정의한 표준 C라이브러리 함수고요, ulink, fcntl같에 파일시스템이 접근하는 등의 시스템 함수들은 kernel 에서 제공하는(라이브러리가 아님) POSIX 표준에 따른 함수들입니다. 물론 linux에서 둘다 glibc에 속해있긴 하지만요..

man page를 보셔도 전자는 3번Library calls (functions within system libraries)에 나오고요, 후자는 2 System calls (functions provided by the kernel)에 속해 있습니다.

C++에서 제공하는 stl등의 library 만으로도 "표준 C library"의 기능은 대체하고도 남는다고 생각합니다. 아니, 어떻게 쓰느냐에 따라서 어떤 언어의 라이브러리보다도 강력하다고도 볼 수 있겠죠.

하지만 Standard Library라는 것은 어느 환경에서도 사용가능한 "표준"을 제공하기 위한 것이고 시스템별로 기능과 동작이 전혀 다른 파일시스템이나 통신환경등은 라이브러리에서 제공할수 있는 문제가 아닙니다. 커널에서 제공하는 이런 System Call이라고 부르는 기능들이 바로 OS가 제공할 수 있는 기능을 규정지으며 OS자체의 고유한 특징이 됩니다.

Posix system call 함수들이 대부분 C 함수의 형태로 제공되는 이유는 posix계열의 unix또는 linux 커널들이 C로 개발되었기 때문입니다. (C++로 작성된 OS도 있다고 들었습니다 BeOS였던가...)

또 자바를 말씀하셔서 조금 ㅤㄷㅓㅈ붙이자면, 자바를 조금이라도 아시는 분은 Java라는 것이 단순히 하나의 언어를 지칭한다고는 생각하지 않을 겁니다. JVM이라는 OS의 환경을 abstraction해주는 가상의 환경이야말로 Java의 핵심입니다. 자바를 하나의 "플랫폼"이라고 부르는 이유가 바로 여기에 있습니다. 어는 OS에서나 자바로 코딩을 하면 java라는 통일된 플랫폼이 제공해주는 시스템 기능을 사용할 수 있는 것입니다.

물론 C++로도 여러 OS상의 system call들을 추상화시켜서 제공하여 portability를 높이려는 시도를 하는 library들이 많이 있습니다. 멀티플랫폼 네트웍 프로그래밍에 많이 사용되는(사실은 제가 지금 공부하고 있는;;;) ACE library가 대표적인 예인데요, 공부해 보시면 알겠지만 내용이 굉장히 방대한데, 사용하기 까다롭고(프로그램 구조를 프레임웍 구조에 맞춰야 함), 멀티플랫폼 프로그래밍을 위해서는 코드가 상당히 지저분해지는 등 "표준" 라이브러리로 제공되기 위한 성격과는 맞지 않습니다.

zelon의 이미지

물론 자바를 예로 들었던 것은 프로그래머의 편리성을 도와주는 존재로써의 자바를 뜻한 것이었습니다. ^^;;

으음.. 그렇다면 unlink(), rename() 등을 wrapping 한 클래스로써의 C++ 라이브러리를 만든다면 꽤 재미있을 것 같네요.

.NET 개발툴 환경에서 CodeAssitence 를 쓰면서 느낀 C++ 의 장점이 namespace 의 요소들이나 클래스의 멤버함수, 멤버변수를 보여주는 거라서... 이 편리함에 너무 익숙해져서 이제 표준 C 의 함수 찾기가 힘들어서 말이죠. 사실 C 는 거의 win32 에서만 해서... ^^;;

하나하나씩 모아서 wrapping class 를 만들어봐야겠습니다. ㅋㅋ

-----------------------------------------------------------------------
GPL 오픈소스 윈도우용 이미지 뷰어 ZViewer - http://zviewer.wimy.com
블로그 : http://blog.wimy.com

ddoman의 이미지

zelon wrote:

으음.. 그렇다면 unlink(), rename() 등을 wrapping 한 클래스로써의 C++ 라이브러리를 만든다면 꽤 재미있을 것 같네요.
..........
하나하나씩 모아서 wrapping class 를 만들어봐야겠습니다. ㅋㅋ

당근 엄청 많습니다.
대부분의 C++ cross plattform library들은 거의 다 file operation wrrapper class가 있습니다. 물론 해당 특정 플랫폼 의존적인 기능들은 잘 제공하지 않지만 대부분의 공통적인 것들은 다 가지고 있죠.

boost, ACE만 찾아보셔도 원하시는건 다 얻을수 있을듯..

댓글 달기

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