2012-10-26 3 views
2

C에서 파일 포인터를 '동적으로'할당하는 것이 가능합니까? 내가 의미하는 것은 이것이다 : n은 정수 값입니다동적으로 파일 포인터의 배열을 할당

FILE **fptr; 
fptr = (FILE **)calloc(n, sizeof(FILE*)); 

. 포인터 값의 배열이 필요하지만 사용자 입력을 받기 전에 얼마나 많은 문자인지 알지 못하기 때문에 하드 코딩 할 수 없습니다. 도움이 될 것입니다!

+1

같은 배열에 대한 이유는 무엇인가, 내가 배열을 축소하는 코드를 보여 주었다하지 않은,하지만 성장 코드와 매우 유사? – rkosegi

+1

FILE *의 배열을 원한다면 위 코드를 사용할 수 있습니다. 각 FILE *은'fptr [n]'으로 인덱스 될 수있다. 완료되면 모든 블록을 닫고 블록을 무료로 가져 오십시오. 왜 네가 이러는 거냐고 묻지 않을거야. 그게 * 당신의 문제 =) – WhozCraig

+0

@rkosegi - 동시에 여러 파일을 열려고합니다.파일에는 순차적으로 번호가 매겨져 있으므로 동시에 루프를 열어서 모두 열 수 있다고 생각했습니다. – Kitchi

답변

2

그들을 메모리를 할당 할 수 있지만 fclose()하는 것을 잊지 마세요 각 파일 포인터를 다음 free() 그래서 포인터 (또는 플렉스 배열), 즉 프로그램 수명 동안 동적으로 크기가 변경되는 배열입니다. 이러한 엔티티는 C의 네이티브 형식 시스템에는 존재하지 않으므로 직접 구현해야합니다. 다음은 배열의 요소 유형이 T 인 것으로 가정합니다. 아이디어는 특정 유형의 콘텐츠와 관련이 없기 때문입니다. (귀하의 경우에는, TFILE *입니다.)

더 이하, 당신은 다음과 같습니다 구조체 원하는 : 초기화하고이 구조를 조작하는

struct flexarray { 
    T *array; 
    int size; 
} 

과 기능의 가족을. 먼저 기본 접근자를 봅시다.

T fa_get(struct flexarray *fa, int i) { return fa->array[i]; } 
void fa_set(struct flexarray *fa, int i, T p) { fa->array[i] = p; } 
int fa_size(struct flexarray *fa) { return fa->size; } 

이러한 기능은 오류 검사를 수행하지 않습니다. 실제 생활에서는 범위 검사를 fa_getfa_set에 추가해야합니다. 이 기능은 flexarray가 이미 초기화되어 있다고 가정하지만, 그렇게하는 방법을 표시하지 않습니다 :이 빈으로 flexarray을 시작한다는

void fa_init(struct flexarray *fa) { 
    fa->array = NULL; 
    fa->size = 0; 
} 

참고. 이러한 초기화 프로그램이 고정 된 최소 크기의 배열을 만드는 것은 일반적이지만, 크기가 0부터 시작하여 배열 증가 코드 (아래 참조)를 실행하고 실제로는 거의 아무런 비용이 들지 않습니다.

마지막으로 flexarray을 어떻게 커 보이게합니까? 그것은 실제로 매우 간단 다음 flexarray에서 새로운 요소가 초기화되지 않은 있습니다

void fa_grow(struct flexarray *fa) { 
    int newsize = (fa->size + 1) * 2; 
    T *newarray = malloc(newsize * sizeof(T)); 
    if (!newarray) { 
     // handle error 
     return; 
    } 
    memcpy(newaray, fa->array, fa->size * sizeof(T)); 
    free(fa->array); 
    fa->array = newarray; 
    fa->size = newsize; 
} 

하는 것으로, 당신은 그것에서 인출하기 전에 각 새로운 인덱스 내가에 뭔가를 저장하기 위해 준비해야하므로.

매번 어떤 상수 곱셈기로 성장하는 플렉시 어레이가 일반적으로 좋은 아이디어라고 말하고 있습니다. 그 대신 크기를 일정한 증가분만큼 늘리면 배열의 요소를 복사하는 이차 시간을 보냅니다.

+0

이것은 멋지지만 ... 제 코드가 제 경우에 효과가있는 것 같습니다. 이것은 동일한 것을 구현하는 또 다른 방법일까요? – Kitchi

+0

'callloc()'을 사용하는 것은 정말로 이상합니다. 다음에 수행 할 복사를 포함하는'realloc()'대신 무의미한 제거 (블록을 ​​효율적으로 확장 할 기회 없음)가 있습니다. – unwind

+0

@unwind : 'realloc'을 사용해야하는지 아닌지에 대한 의견이 다릅니다. 이는 하나의 단일 진입 점에 대해 아마도 많은 비트를 갖는 보편적 인 할당/증가/축소/자유 기능입니다. 즉, 나는'calloc'을 이와 같이 코드에서 사용하지 않을 것이고'malloc' (또는 아마도'realloc')을 사용할 것입니다. –

1

는 단지 어떤 방법을 사용하면 메모리를 당신은 유연한 배열이라고 때로는 무엇을 구현하기 위해 노력하고

+0

아마도'fclose()'입니까? –

+0

@Joseph : 예. 그렇습니다. 사실 그 뜻은 – Omkant

관련 문제