파일 읽을 때 malloc로 메모리 할당 시 파일 크기 만큼 할당 하면 될까요?

사랑천사의 이미지

안녕하세요?
이여송 사도요한입니다.

아래 질문 드린 내용을 다시 생각 하고 소스 코드를 좀 변경 해 가면서 생각 해 봤습니다. malloc도 결국 메모리를 동적으로 할당 하여 쓰긴 하지만, 문제는 파일 크기가 얼마인지 알 수 없는 상황에서 그냥 메모리를 할당 할 수는 없는 것이니 ... 패이징 기법(잘 모르는...)을 쓸 수도 없는 것이고... 파일 포인터를 왔다 갔다 하면서 앞부분 읽어서 출력 하고 또 뒷부분 읽어서 출력 하고 하는 식으로 말이죠.. 이렇게 되면 파일 처리가 끝 날 때 까지 계속 파일 디스크립터를 열어 둬야 하는데 흐흠. 어쩌면 낭비 같기도 하고 흐흠... 모르겠군요.. 어떤 방법이 좋을런지...

아이디어 부탁 드립니다.
그리고 읽을 대는 문자 단위로 읽어서 배열이나 포인터로 지정된 char에 넣을 때는 어떻게 잘라서 넣어야 할까요.. 으음...

어떻게 하는게 좋을지 잘 모르겠네요...

대충 뭐 이런 식으로...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_FS 2000001
 
int main (int argc, char **argv)
{
  unsigned long int c;
 
  char *data;
 
  FILE *fd;
 
  if (argc == 1) {
    printf ("사용법: readfile <파일명>\n");
    exit (0);
  }
  else if (argc > 2) {
    printf ("인자가 너무 많음.\n"
            "사용법: readfile <파일명>\n");
    exit (0);
  }
  if (!fd = fopen (argv[1], "rt")) {
    printf ("파일 열기 오류. - %s\n", argv[1]);
    exit (-1);
  }
  data = (char *) malloc (MAX_FS);
  c = 0;
 
  bzero (&data, MAX_FS - 1);
  while (c < MAX_FS - 1) {
    if (feof (fd)) {
      puts ("읽기 성공.");
      break;
    }
    data[geshifilter-c] = fgetc (fd);&#10;    c++;&#10;  }&#10;  fclose (fd);&#10;  puts (data);&#10;  free (data);&#10;}&#10;
아마 요렇게 하면 파일이 2백만 바이트 보다 크면 읽다가 그만 둬 버릴 겁니다. 다 읽기도 전에 fclose가 될 거니까요. 그렇다면 이놈을 어떻게 해야 할 지 흐흠... 어렵네요 으음... 흐흠... 모두 행복하세요. 이여송 사도요한 드림.[/geshifilter-c]
IDNed의 이미지

웬지 프로그램 내용은 고양이와 비슷하네요 ^^
이정도면 그냥 디스크립터 열어두고 하시는게 성능상 좋지 않을까요? ;)

파일크기는 fseek와 ftell을 조합해서 얻을 수 있는걸로 알고 있습니다.
제가 파일 입출력은 많이 안해봐서 -_-
그렇게 얻고 malloc 하시면 정확히 얻을 수 있지 않을까요?

사랑천사의 이미지

고양이의 뜻을 모르겠군요.. 후훗... 고양이처럼 약삭 빠르단 소리신지. 흐흠.. 프로그램 코드가.. 근대 왜 <code> 하니까 그 안에 들어 잇는건 빈줄이 전부 무시 되는 건지 모르겠군요. 흐흠... 그렇다고 BBCode의 code를 쓰면 또 이상해 지던데... 왜 댓글에선 BBCode가 제대로 먹고 저기선 안 먹을 까요.. 원본 글... 제대로 말이죠... 아무튼... fseek라 흐흠.. 한번 생각 해 봐야 겠군요.

감사합니다...
이여송 사도요한 드림.
PS:근대 여전히 의문은 잘 안 풀리는 군요... 후훗...
----
일어나라! 싸워라! 그리고 이겨라!
다만!!! 의미 있는 것에 그 힘을!!!
그 능력과 노력을!!!

사람천사

IDNed의 이미지

고양이를 영어사전으로 찾아보세요 ^^

Code를 보여주는 태그 중 최강의 태그는 xmp 태그인데 통할지는 모르겠네요.

아, fseek 사용시 랜덤 접근(Random Access)이라는 사실은 알고 계시죠? ^^
그리고 혹시 이 방법보다는 System API에 파일크기 알아내는 함수가 있는지를 먼저 찾아보심이 좋을듯 합니다.(Portable하진 않아도...)
fseek/ftell 조합은 약간 편법성이 짙거든요...
Windows API에서는 GetFileSize API가 있었는데... 쩝...

사랑천사의 이미지

fseek를 쓴 적이 없어서 원... ftell은 뭐 현재 파일 포인터 위치를 찾을 수 있는 물건이니 쓰이기가 좋은데 fseek는 좀 어렵군요(하실 fseek는 한번도 안 써 봤습니다. 스트림에서 포인터 위치로 찾아 간다고 되어 있는데 이걸 원 어떻게 써야 할지 후훗...)

아무튼 감사합니다. 좀 더 생각 해 봐야 겠군요. (근대 아무리 봐도 API를 쓰는게 좋아 보이는 이유는 뭘까요...) 그리고 뭐 저는 리눅스에서 작업 합니다. BSD 같은 데로 옮길 이유도 없고 대부분 UNIX 계열이라면 먹겠지요 흐흠... POSIX 호환성만 있다면... 흐흠...

모두들 행복하세요.
이여송 사도요한 드림.
----
일어나라! 싸워라! 그리고 이겨라!
다만!!! 의미 있는 것에 그 힘을!!!
그 능력과 노력을!!!

사람천사

superkkt의 이미지

stat 함수를 사용하면 파일 사이즈를 알 수 있습니다. 그런데 프로그램 용도가 파일 전체 내용을 메모리로 읽어들여서 보관하는것이 아니라면 파일 사이즈만큼 메모리를 할당해서 작업하는건 효율적이지 못한것 같습니다.

적당한 크기의 버퍼(예를들어 8192바이트)를 생성하고 파일을 읽어들인 후에 원하는 작업(출력, 복사 등)을 하고 또 그 뒷부분을 읽어들여서 같은 과정을 반복해서 파일의 끝을 만날때까지 반복하는 방법을 사용해서 만들어 보세요~

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

사랑천사의 이미지

저걸 편집기나 파일 리더로 쓰려고 그러거든요. 실시간으로 읽어서 출력 하는 방법을 쓰는게 효율적이라는 말씀이신지 으음...

흐흠... 파일 리더라면 순차적으로 읽어서 처리 하면 되겠지만, 편집기라면 좀 애매모호할 것 같네요. VI의 경우 그런 식으로 처리 하는 것 같긴 한대 으음. 소형 편집기라면 굳이 그렇게 만들어야 하나 하는 생각이 드네요. 이전 TEXT BBS등에서 사용되던 라인 편집기 뭐 그런 거죠.. 후훗...

아무튼. 흐흠... 그렇네요 으음...

감사 드리고요. 행복하세요. stat 함수라 흐흠. 그것도 한번 생각 해 봐야 겠군요 으음...

이여송 사도요한 드림.
----
일어나라! 싸워라! 그리고 이겨라!
다만!!! 의미 있는 것에 그 힘을!!!
그 능력과 노력을!!!

사람천사

cinsk의 이미지

대개, 편집기와 같은 프로그램은 줄 단위로 리스트를 만들어서 관리합니다. 즉

struct line {
  char *data;
  struct line *prev;
  struct line *next;
};

과 같이 합니다. 그리고 파일의 크기가 클 경우, 일부분만 읽어서 작업하기도 합니다.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

댓글 달기

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