2010-02-26 5 views
2

에는 내가 직면하고있는 특정 문제에 접근하는 방법에 대한 일반적인 질문이있었습니다. 나는 C에 상당히 새롭다. 그래서 나와 여기에서 품는다. 1000 + 텍스트 파일이있는 폴더가 있다고 가정하면 파일의 번호가 매겨진 순서대로 지정되지는 않지만 알파벳 순서입니다. 내 문제는 주식 데이터 파일이 있고, 각 파일의 이름은 회사의 각기 다른 이름으로되어 있습니다. 나는 각 파일을 열고, 역사적 최저점을 찾아 그것을 현재 가격과 비교하고 퍼센트 변화율을 계산하는 프로그램을 작성한 다음 그것을 인쇄하고 싶다. 검색 및 계산은 문제가되지 않지만 문제는 프로그램이 각 파일을 열어서 열려고하는 것입니다. 이 공격을 볼 수있는 유일한 방법은 모든 시세 기호를 포함하는 텍스트 파일을 작성하여 프로그램이이를 배열로 읽어 들이고 배열의 첫 번째 파일 이름을 먼저 열고 편집을 수행하는 루프를 실행하는 것입니다 출력을 닫고 파일을 닫은 다음 배열의 두 번째 요소 (다음 티커 심볼)로 이동합니다. 이것은 상당히 간단 할 것 같아요. (필자는 생각합니다.)하지만 천개의 파일 이름을 텍스트 파일에 타이핑하는 것을 피하고 싶습니다. 이것에 접근하는 더 좋은 방법이 있습니까? C에서 정말 놀라운 기능이없는 한 코드를 묻지 않고), 경험 많은 C 프로그래머의 충고 만 받는다.C - 여러 파일 읽기

감사합니다 :)

편집 : 이것은 리눅스에, 나는 그것을 metion 깜빡 죄송합니다!

+2

Windows linux? 그것은 시스템에 따라 다릅니다. –

+0

C++를 사용하는 경우 부스트 Filesystem 라이브러리를 사용하여 디렉토리 경로가 주어지면 디렉토리의 각 항목을 반복 할 수 있습니다. – Kache

+0

+1 다음 번에 질문을 올바르게 포맷하십시오. :). 이해하기 쉽습니다. –

답변

4

당신이 opendir/readdir 디렉토리 구조를 이동하는 데 사용할 수 있습니다

+1

Win32 API에서'FindFirstFile' (또는'FindFirstFileEx') /'FindNextFile' /'FindClose'. – ephemient

+0

Win32 정보를 제공해 주셔서 감사합니다. – mctylr

2

Linux에서 실행중인 가정 ...

ls /path/to/text/files > names.txt 

은 당신이 원하는 것을 정확히이다.

+1

Windows : dir/b> names.txt –

0

접근 방식 1) 나는 티커 데이터 만 포함하고 다른 것은 포함하지 않는 특정 디렉토리가 있습니다. 그런 다음 C readdir API을 사용하여 디렉토리의 모든 파일을 나열하고 필요한 데이터 처리를 수행하는 각 파일을 반복합니다. 파일이 적용되는 티커는 파일 이름에 의해서만 결정됩니다.

장점 : 코드에 쉽게

단점 : 어디에 파일이 저장되어 정말 따라 그들은 어디에서 온.

접근 방식 2) 티커 파일이 티커 파일임을 나타내는 마법 코드와 이름이 포함 된 문자열로 시작하도록 파일 형식을 변경하십시오. 사용하기 전에 readdir을 사용하여 폴더의 모든 파일을 반복하고 각 파일을 열고 마법 번호가 설정되었는지 확인한 다음 파일에서 티커 이름을 읽은 다음 이전과 같이 데이터를 처리합니다.

장점 : 이전보다 유연합니다. 파일 이름에 시세 표시기 이름을 사용할 필요가 없습니다. 단점 : 코드 작성이 어렵고 파일 형식이 고정 될 수 있습니다.

+1

'readdir'은 C API가 아니며 POSIX API입니다. Microsoft의 CRT for Windows에는 이러한 기능이 없습니다. – ephemient

0

하지만 텍스트 파일에 1,000 개가 넘는 파일 이름을 입력하는 것을 피하고 싶습니다. 이것에 접근하는 더 좋은 방법이 있습니까? 내가 무슨 짓을 개인 용도 :

을 위해이기는하지만, 잠시 다시 똑같은 문제를 해결 한

는 OS 쉘은 해당 파일의 목록을 생성 명령을 사용하는 것이었다과 출력을 재 지정 텍스트 파일을 읽고 내 프로그램을 실행시켜야합니다.

0

의사 코드는 다음과 같을 것이다, 나는 코드를 정의 할 수 없습니다 ..

 
for each directory entry 
    scan the filename 
     extract the ticker name from the filename 
     open the file 
       read the data 
       create a record consisting of the filename, data..... 
     close the file 
     add the record to a list/array... 
> sort the list/array into alphabetical order based on 
    the ticker name in the filename... 

원하는 경우 약간 다를 수 있습니다. 디렉토리 항목에서 파일 이름을 검색하고 bui로 먼저 정렬하십시오. 파일 이름이있는 레코드를 먼저 찾은 다음 목록/배열의 시작 부분으로 돌아가서 개별적으로 데이터를 읽은 다음 레코드에 넣습니다. ...

호프가 도움이 되었으면 최고, Tom. 리눅스/유닉스 (BSD, OS X, POSIX, 등)에서

glob_t results; 
memset(&results, 0, sizeof(results)); 
glob("*.txt", 0, NULL, &results); 
for (i = 0; i < results.gl_pathc; i++) 
    printf("%s\n", results.gl_pathv[i]); 
globfree(&results); 
0

는 UNIX에서 편리 glob 기능이있다. 파일 시스템에 원하는 정보가있을 때 업데이트해야하는 정적 파일을 생성 할 필요가 없습니다. 특정 시간에 주식의 하위 집합 만 원할 경우 glob을 사용하면 더 빠를 것이며 scandir도 있습니다.

Visual C++를 C 컴파일러로 사용하여 개발할 경우 어떤 Win32 (Windows/Platform SDK) 함수가 호출되는지 알 수 없습니다. MSDN Library을 검색하면 도움이됩니다.

0

Linux 또는 관련 시스템에서 fts 라이브러리를 사용할 수 있습니다. 그것은 파일 계층 구조를 탐색하기위한 설계 : man ftsreaddir

만큼 간단

또는 무언가를 Windows에서, 당신이 그들의 Directory Management API의를 사용 할 수 있습니다. 보다 구체적으로, 와일드 카드와 함께 사용되는 FindFirstFile 함수는 FindNextFile

1

"디렉토리"라는 개념이없는 표준 C에는 기능이 없습니다. 이를 수행하려면 특정 종류의 플랫폼 특정 기능을 사용해야합니다. 몇 가지 예를 보려면 this post from Cprogrammnig.com을 살펴보십시오.

개인적으로 두 번째 예와 같이 opendir()/readdir() 접근 방식을 선호합니다. Cygwin을 사용하는 경우 Linux 및 Windows에서도 기본적으로 작동합니다.