파일 읽을 때 malloc로 메모리 할당 시 파일 크기 만큼 할당 하면 될까요?
글쓴이: 사랑천사 / 작성시간: 토, 2006/04/01 - 10:52오후
안녕하세요?
이여송 사도요한입니다.
아래 질문 드린 내용을 다시 생각 하고 소스 코드를 좀 변경 해 가면서 생각 해 봤습니다. 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); c++; } fclose (fd); puts (data); free (data); }
Forums:
웬지 프로그램
웬지 프로그램 내용은 고양이와 비슷하네요 ^^
이정도면 그냥 디스크립터 열어두고 하시는게 성능상 좋지 않을까요? ;)
파일크기는 fseek와 ftell을 조합해서 얻을 수 있는걸로 알고 있습니다.
제가 파일 입출력은 많이 안해봐서 -_-
그렇게 얻고 malloc 하시면 정확히 얻을 수 있지 않을까요?
흐흠.... 고양이요???
고양이의 뜻을 모르겠군요.. 후훗... 고양이처럼 약삭 빠르단 소리신지. 흐흠.. 프로그램 코드가.. 근대 왜 <code> 하니까 그 안에 들어 잇는건 빈줄이 전부 무시 되는 건지 모르겠군요. 흐흠... 그렇다고 BBCode의 code를 쓰면 또 이상해 지던데... 왜 댓글에선 BBCode가 제대로 먹고 저기선 안 먹을 까요.. 원본 글... 제대로 말이죠... 아무튼... fseek라 흐흠.. 한번 생각 해 봐야 겠군요.
감사합니다...
이여송 사도요한 드림.
PS:근대 여전히 의문은 잘 안 풀리는 군요... 후훗...
----
일어나라! 싸워라! 그리고 이겨라!
다만!!! 의미 있는 것에 그 힘을!!!
그 능력과 노력을!!!
사람천사
고양이를
고양이를 영어사전으로 찾아보세요 ^^
Code를 보여주는 태그 중 최강의 태그는 xmp 태그인데 통할지는 모르겠네요.
아, fseek 사용시 랜덤 접근(Random Access)이라는 사실은 알고 계시죠? ^^
그리고 혹시 이 방법보다는 System API에 파일크기 알아내는 함수가 있는지를 먼저 찾아보심이 좋을듯 합니다.(Portable하진 않아도...)
fseek/ftell 조합은 약간 편법성이 짙거든요...
Windows API에서는 GetFileSize API가 있었는데... 쩝...
아.. cat! 저걸 저렇게 한 것은... 예제 활용을 위한 거고요. fseek 흐흠...
fseek를 쓴 적이 없어서 원... ftell은 뭐 현재 파일 포인터 위치를 찾을 수 있는 물건이니 쓰이기가 좋은데 fseek는 좀 어렵군요(하실 fseek는 한번도 안 써 봤습니다. 스트림에서 포인터 위치로 찾아 간다고 되어 있는데 이걸 원 어떻게 써야 할지 후훗...)
아무튼 감사합니다. 좀 더 생각 해 봐야 겠군요. (근대 아무리 봐도 API를 쓰는게 좋아 보이는 이유는 뭘까요...) 그리고 뭐 저는 리눅스에서 작업 합니다. BSD 같은 데로 옮길 이유도 없고 대부분 UNIX 계열이라면 먹겠지요 흐흠... POSIX 호환성만 있다면... 흐흠...
모두들 행복하세요.
이여송 사도요한 드림.
----
일어나라! 싸워라! 그리고 이겨라!
다만!!! 의미 있는 것에 그 힘을!!!
그 능력과 노력을!!!
사람천사
stat 함수를 사용하면
stat 함수를 사용하면 파일 사이즈를 알 수 있습니다. 그런데 프로그램 용도가 파일 전체 내용을 메모리로 읽어들여서 보관하는것이 아니라면 파일 사이즈만큼 메모리를 할당해서 작업하는건 효율적이지 못한것 같습니다.
적당한 크기의 버퍼(예를들어 8192바이트)를 생성하고 파일을 읽어들인 후에 원하는 작업(출력, 복사 등)을 하고 또 그 뒷부분을 읽어들여서 같은 과정을 반복해서 파일의 끝을 만날때까지 반복하는 방법을 사용해서 만들어 보세요~
======================
BLOG : http://superkkt.com
======================
BLOG : http://superkkt.com
그럼 위처함 2MB 가까이 할당 하고 ...
저걸 편집기나 파일 리더로 쓰려고 그러거든요. 실시간으로 읽어서 출력 하는 방법을 쓰는게 효율적이라는 말씀이신지 으음...
흐흠... 파일 리더라면 순차적으로 읽어서 처리 하면 되겠지만, 편집기라면 좀 애매모호할 것 같네요. VI의 경우 그런 식으로 처리 하는 것 같긴 한대 으음. 소형 편집기라면 굳이 그렇게 만들어야 하나 하는 생각이 드네요. 이전 TEXT BBS등에서 사용되던 라인 편집기 뭐 그런 거죠.. 후훗...
아무튼. 흐흠... 그렇네요 으음...
감사 드리고요. 행복하세요. stat 함수라 흐흠. 그것도 한번 생각 해 봐야 겠군요 으음...
이여송 사도요한 드림.
----
일어나라! 싸워라! 그리고 이겨라!
다만!!! 의미 있는 것에 그 힘을!!!
그 능력과 노력을!!!
사람천사
대개, 편집기와 같은
대개, 편집기와 같은 프로그램은 줄 단위로 리스트를 만들어서 관리합니다. 즉
과 같이 합니다. 그리고 파일의 크기가 클 경우, 일부분만 읽어서 작업하기도 합니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기