2012-03-28 3 views
0

많은 양의 파일이 있는데 각 숫자는 공백으로 구분됩니다.파일에서 빠르게 위치 찾기

이러한 같은 : (124) 1212 5 654 74231 ...

어떻게 빨리이 파일의 N 번째 번호를 찾을 수 있습니까?

나는 그것이 바이트로 측정 있기 때문에 fseek()이 작동하지 않을 수 있습니다 생각하고, 나는에 의해 N 번째 번호를 얻을 수 있습니다 :

int i; 
for (i=0;i!=N-1;++i) fscanf(somefile,"%d",&variable); 

을하지만보다 효율적인 몇 가지 방법이있을 수 있습니다 생각?

+1

, 당신은 ftell은() 당신이 돌아 fseek의에 전달할 수있는 파일 포인터의 바이트 위치를 얻을 수 있습니다 그 위치가 거의 즉시. –

+0

@MarcB 불행히도 방금 찾은 번호로 돌아갈 필요가 없습니다. 수십만 개의 다른 번호를 찾은 후에 되돌아 갈 수 있습니다. – goofy

+0

파일에 저장된 숫자에 속성이 없으면 (예 : 모두 3 자리), 유일한 방법은 N 번째 정수에 도달 할 때까지 전체 파일을 읽는 것입니다. – mfontanini

답변

1

파일을 만들 경우, 다른 두 옵션은 다음과 같습니다

  1. 인쇄 고정 폭 필드 sufficie에서 각 번호 최대 수 (예 : 파일을 사람이 읽을 할 필요가없는 경우 "%의 5D")는 다음 fseek(somefile,(N-1)*6,SEEK_SET)는 대신 파일에 ASCII 문자의 바이너리 데이터로 정수를 fwrite()하고 그들을 액세스 할 수 있습니다, 번호 N.

  2. 에 위치합니다 당신이 fscanf 등을 사용하여 파일의 위치를 ​​찾았 으면

    fseek(somefile,(N-1)*sizeof(int),SEEK_SET) 
    fread(&variable,sizeof(int),1,somefile) 
    
4

전체 파일을 한 번 읽고 파일의 일부 데이터 포인트에 대한 색인을 만듭니다 (예 : 1000 포인트). 색인의 각 항목은 파일의 위치를 ​​그 위치에서 시작하는 N 번째 번호로 맵핑 할 수 있습니다. 이 인덱스를 만들 때마다 N 번째 숫자를 찾을 때마다 인덱스에서 가장 가까운 항목을 찾아 파일에서 가장 가까운 것으로 알려진 점을 찾아 fseek으로 지정할 수 있습니다. 그런 다음 fscanf을 사용하여 검색을 수행하여 값을 찾으십시오. 이렇게하면 인덱스에 대해 일부 메모리를 사용하는 비용으로 검색 시간이 단축됩니다.

인덱스의 항목이 같을 수있다 : (파일, 숫자 1 오프셋) 가 (파일, 수 2 2 오프셋) : (파일 오프셋 번호 N)

인덱스 같을 수있다. .. (파일 N, 수 N 오프셋)