배열을 조금 더 이해하셔야 겠습니다.
읽어들인 파일명을 배열로 저장하신다고 하셨는데, 문제는 읽어들인 파일명이 이미 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]배열에만 입력되는것 같습니다.
: 어디가 잘못된것이고 어떻게 고쳐야 하는지요..
|