2012-11-17 2 views
2

디렉토리에 파일이 많다는 것을 알고 텍스트 파일에서 데이터를 읽고 추출하는 올바른 방법은 무엇입니까? fopen()을 사용하여 파일에 대한 포인터를 얻은 다음 while(fgets(..) != null){}과 같은 작업을 수행하여 전체 파일을 읽을 수는 있지만 어떻게하면 다른 파일에서 읽을 수 있습니까? 디렉토리의 모든 파일을 반복하고 싶습니다.C에서 여러 텍스트 파일 읽기

+0

모든 파일을 동시에? 컴퓨터에 코어가있는만큼 많은 파일을 동시에 읽을 수있게 해주는 pthread 이외에 어떤 방법이 있는지 모르겠습니다. – Shredderroy

+2

단순히 첫 번째 파일을 닫고 같은 파일 포인터를 사용하여 다음 파일을 열고 루프를 실행할 수 있습니까? – Kairan

답변

2

샘, 다음과 같은 작은 함수에서와 같이 opendir/readdir을 사용할 수 있습니다.

#include <stdio.h> 
#include <dirent.h> 

static void scan_dir(const char *dir) 
{ 
    struct dirent * entry; 
    DIR *d = opendir(dir); 

    if (d == 0) { 
     perror("opendir"); 
     return; 
    } 

    while ((entry = readdir(d)) != 0) { 
     printf("%s\n", entry->d_name); 
     //read your file here 
    } 
    closedir(d); 
} 


int main(int argc, char ** argv) 
{ 
    scan_dir(argv[1]); 
    return 0; 
} 

이것은 명령 줄에서 명명 된 디렉토리를 열고 포함 된 모든 파일의 이름을 인쇄합니다. 그러나 이름을 인쇄하는 대신 원하는대로 파일을 처리 할 수 ​​있습니다 ...

+0

이 작동하지만 이상한 행동을 해요 : 2 반복 it "." 다음 "..", 둘 다 분명히 파일 이름이 아닙니다. 나머지는 괜찮아요. 어떤 아이디어? – Sam

+0

리눅스에서 한 점은 현재 디렉토리를 나타내며 두 ​​개의 점은 상위 디렉토리를 나타냅니다. 둘 다 모든 디렉토리 내의 유효한 오브젝트입니다. – dst2

1

일반적으로 파일 목록은 프로그램에 명령 줄로 제공되므로 두 번째 매개 변수로 main()에 전달 된 포인터 배열에서 사용할 수 있습니다. 즉, 호출하는 쉘은 디렉토리의 모든 파일을 찾는데 사용되며, 프로그램은 argv []를 반복하여 각각을 열고 처리합니다.

참조. 162 "The C Programming Language", Kernighan and Ritchie, 2 판, 사용할 수있는 코드에 대한 거의 완전한 템플릿. 이 예제에서 filecopy() 기능에 대한 사용자 자신의 처리를 대체하십시오.

프로그램에서 직접 디렉토리 (또는 디렉토리)를 읽어야한다면, libc의 opendir (3) 및 관련 함수를 읽는 것이 좋습니다. 일부 시스템은 ftw (3) 또는 fts (3)라고하는 라이브러리 함수도 제공하므로 매우 편리합니다.