FILE 포인터 질문입니다.

nayana의 이미지

파일 포인터를 동적으로 할당하고 해제 하는 부분에서 세그먼테이션이 떨어집니다.
일단. 다음과 같이 동적으로 할당 하였습니다.

FILE** m_Fp;
m_Fp = new FILE* [ 3 ];

그리고 해제 하는 부분에서 다음과 같이 하였습니다.
if ( m_Fp )
{
for ( int i = 0; i < 3; ++i )
fclose( m_Fp[i] )

delete [] m_Fp;
m_Fp = 0;
}

이 부분에서 세그먼테이션이 떨어졌습니다.
fclose( m_Fp[i] )
그래서
if ( m_Fp) delete[] m_FP;
m_Fp = 0;
이렇게 하니까 양호합니다. 파일포인터를 열었으니까. fclose로 닫아주어야 메모리릭이 안날것 같은데...어케 해야할지 모르겠습니다.

sjpark의 이미지

왜 파일 조작하는 스트림 변수를 동적으로 할당하는지..

파일을 수억개를 조작해야 하기 때문에, 한번에 배열로 모두 할당하는게 어려운건지..

코드 좀 복작하게 보이게 해서 다른 사람 볼때 잘 못하면 피 보게 하려고, 일부러 저렇게 "메모리 할당"까지 해가면서 하는 것인지.(혹시 뒤에 이어 받을 사람이 얄미워서 엿먹일려고?)

파일 포인터 쓰는데 메모리 할당을 안하면 안되는 아주 심오한 알고리즘이 있는건가요? 흐흐.. 아직 잘 몰라서...

저 문제에 대한 직접접인 도움이 될만할거라 예상되는 건,

"fopen해서 할당자 받아올때, 제대로 열려서 NULL값이 넘어오진 않았는지 확인은 해 보셨나요?"

그럼.

nayana의 이미지

일단 fopen해서 NULL값에 대한 검사는 했습니다.
일단 동적으로 할당한 이유는 파일을 여는 갯수가 일정치가 않습니다.
파일을 2개를 열수 있고 3개도 열수 있고 1개만 열수도 있습니다.
또한 4, 5 ....개도 열수 있습니다. 위의 예제에서는 3개라고 해놓았지만..
사람마다 파일을여는 개수가 틀리기 때문에
예를 들어서 ./lfw a.txt b.txt c.txt d.txt e.txt 이런식으로 하면
파일을 여는 갯수가 5개 입니다. 배열로 잡으면 일정갯수 밖에 열수가 없기때문에 동적할당을 한것입니다.

m_Fp = new FILE* [ 파일갯수 ]; 입니다.

doldori의 이미지

m_Fp[i]가 fopen()으로 초기화되었나요? 그렇지 않으면 fclose()의 결과는
정의되지 않습니다. 다음 코드로 검사해 보세요.

for (int i = 0; i < 3; ++i)
    m_Fp[i] = fopen(filename[i], "r");
// use m_Fp[i]
for ( int i = 0; i < 3; ++i ) 
    fclose( m_Fp[i] ) ;

아마 argv로 파일 이름을 가져오는 것 같은데 인자가 제대로 fopen()으로
전달되는지도 확인해 보시고요.