외랑 님이 쓰신 글 :
: 배열을 조금 더 이해하셔야 겠습니다.
: 읽어들인 파일명을 배열로 저장하신다고 하셨는데, 문제는 읽어들인 파일명이 이미 char형의 배열이라는 겁니다.
: 비록 수행되기는 할 지라도, 메모리 상으로 에러의 소지를 다분히 가지고 있는 소스입니다.
: 먼저 파일명을 확장자와 분리 하시려고 name[3]이라는 배열을 쓰셨는데,
: 파일명이 8자라고 가정하면 (ex: 12345678.bmp)
: name[i]에서 변수 i는 과연 몇 까지 증가 할까요? 네.. 8개 문자 즉 i는 7이됩니다.
: 그런데 선언은 3개만 가질 수 있는 형태이죠... 이게 처음으로 보여지는 문제입니다.
:
: 두번째는 파일명을 저장할 장소로, sortn[MAX] 를 char * 형으로 선언하셨습니다.
: 이는 sortn[n] 은 단순히 포인터값만 저장할 수 있는 배열입니다. 그러나 대입부분을 보시면
: sortn[n] = name 이라고 쓰셨습니다. name은 파일명을 떼오는 크기와 위치가 고정된 공간입니다.
: 이는 n이 증가함에 따라 sortn[n]에 들어있는 값이 가르키는 곳은 name이 저장된 위치다.
: 즉, sortn[0]이나 sortn[1]이나 sortn[2]이나 ... n까지 동일한 위치만 가르키는 것이죠..
: 데이타로 살펴보면 더 쉽게 이해하실 수 있습니다. (주소만 대입될 뿐이지 내용은 복사되지 않는다는 것이죠)
: 예를 들어 name의 저장주소가 1000번지라고 했을때
: n=0일때 sortn[0] = name ---> 요문장은 sortn[0]은 1000 번지가 됩니다.
: n=1일때 sortn[1] = name ---> 요문장은 sortn[1]은 역시 1000 번지가 됩니다.
: 이해가 되시나요?
: 나름대로 조금 수정해 보았습니다. 참고하시길 바랍니다.
:
: //---------------------------------------------------------------------------
: #include <stdio.h>
: #include <conio.h>
: #include <stdlib.h>
: #include <dir.h>
:
: #define MAXCOUNT 20
:
: void main(void)
: {
: struct ffblk ffblk;
: int i, j, k, done, n=0;
: char name[MAXFILE];
: char sortn[MAXCOUNT][MAXFILE]; // MAXFILE은 dir.h에 정해져있는 파일명의 최고길이
:
: printf("디렉토리에 있는 *.bmp 형식의 리스트.\n");
: done = findfirst("*.bmp", &ffblk, 0);
: while(!done)
: {
: for (i=0, j=0; i<strlen(ffblk.ff_name); i++)
: {
: if(ffblk.ff_name[i] == '.')
: {
: name[j] = '\0'; break;
: }
: else name[j++] = ffblk.ff_name[i];
: }
:
: for(k=0; k<=j; k++) sortn[n][k] = name[k]; //name의 내용을 복사합니다.
:
: printf(" %s\n", sortn[n++]); // 내용을 출력하고 인덱스를 증가시킵니다.
:
: done = findnext(&ffblk); // 다음 파일을 찾습니다.
: }
: getch(); // 한문자를 받으면 종료합니다.(conio.h필요.. 윈도우라 결과볼려구요..^^*)
: }
: //---------------------------------------------------------------------------
:
:
:
:
: 왕초보 님이 쓰신 글 :
: : 읽어들인 파일명을 배열로 저장하려고 합니다.
: : #include <stdio.h>
: : #include <stdlib.h>
: : #include <dir.h>
: : #define MAX 20
: :
: : void main(void)
: : {
: : struct ffblk ffblk;
: : int done;
: : int i, j;
: : char name[3];
: : int n = 0;
: : char *sortn[MAX];
: :
: : printf("디렉토리에 있는 *.bmp 형식의 리스트.\n");
: : done = findfirst("data\\img\\*.bmp", &ffblk, 0);
: : while (!done){
: : for (i = 0, j = 0; i < strlen(ffblk.ff_name); i++){
: : if (ffblk.ff_name[i] == '.'){
: : name[j] = '\0';
: : break;
: : }
: : else {
: : name[j] = ffblk.ff_name[i];
: : j++;
: : }
: : }
: :
: : sortn[n] = name; //----┐
: : n++; // |-이부분
: : printf(" %s\n", sortn[0]); //-----┘
: : done = findnext(&ffblk);
: :
: :
: : }
: : }
: :
: : sortn[n] = name; 이부분에서 배열로 저장해야하는데
: : printf(" %s\n", sortn[0]); <-- 이렇게 해보면 첫번째 배열값(파일명)만 계속 출력되야하는데 디렉토리에 있는 파일들 전부 출력됩니다. 즉, 배열에 순서대로 들어가지 않고 파일명이 모두 sortn[0]배열에만 입력되는것 같습니다.
: : 어디가 잘못된것이고 어떻게 고쳐야 하는지요..
|