파일과 디렉터리의 기본 개념
파일(file)은 디스크 상에 데이터가 실제로 저장되는 물리적인 위치를 의미하며, 디렉터리(directory)는 파일을 체계적으로 정리하기 위한 논리적인 경로입니다. 모든 파일은 반드시 하나의 디렉터리 안에 존재합니다.
프로그래밍에서 파일에 대해 수행할 수 있는 기본 연산은 크게 세 가지입니다.
- 파일 열기
- 파일 처리(읽기, 쓰기, 수정)
- 파일 저장 후 닫기
C 프로그램 코드
다음은 입력 파일의 정수를 읽어 짝수, 홀수, 소수를 각각 별도의 파일에 저장하는 C 프로그램입니다.
#include <stdio.h>
#include <stdlib.h>
/* Function declarations */
int even(const int num);
int prime(const int num);
int main(){
FILE * fptrinput,
* fptreven,
* fptrodd,
* fptrprime;
int num, success;
fptrinput = fopen("numbers.txt", "r");
fptreven = fopen("even-numbers.txt" , "w");
fptrodd = fopen("odd-numbers.txt" , "w");
fptrprime= fopen("prime-numbers.txt", "w");
if(fptrinput == NULL || fptreven == NULL || fptrodd == NULL || fptrprime == NULL){
/* Unable to open file hence exit */
printf("Unable to open file.\n");
exit(EXIT_FAILURE);
}
/* File open success message */
printf("File opened successfully. Reading integers from file. \n\n");
// Read an integer and store read status in success.
while (fscanf(fptrinput, "%d", &num) != -1){
if (prime(num))
fprintf(fptrprime, "%d\n", num);
else if (even(num))
fprintf(fptreven, "%d\n", num);
else
fprintf(fptrodd, "%d\n", num);
}
fclose(fptrinput);
fclose(fptreven);
fclose(fptrodd);
fclose(fptrprime);
printf("Data written successfully.");
return 0;
}
int even(const int num){
return !(num & 1);
}
int prime(const int num){
int i;
if (num < 0)
return 0;
for ( i=2; i<=num/2; i++ ) {
if (num % i == 0) {
return 0;
}
}
return 1;
}실행 결과
위 프로그램을 컴파일하여 실행하면 다음과 같은 결과가 출력됩니다.
File opened successfully. Reading integers from file. Data written successfully.
프로그램 설명
입력 파일인 numbers.txt에는 1부터 17까지의 정수가 저장되어 있으며, 프로그램은 이 값들을 조건에 따라 세 개의 파일로 나누어 기록합니다.
입력 파일:
numbers.txt 파일 내용: 1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17
읽기 모드("r")로 이미 존재하는 파일을 엽니다.
실행 후 짝수, 홀수, 소수가 각각 별도의 파일로 분류되어 저장됩니다.
even-numbers.txt: 4 6 8 10 12 14 16
odd-numbers.txt: 9 15
prime-numbers.txt: 1 2 3 5 7 11 13 17동작 원리
- fopen() 함수로 입력 파일은 읽기 모드("r")로, 출력 파일 세 개는 쓰기 모드("w")로 엽니다.
- 파일 열기에 실패하면 오류 메시지를 출력한 뒤 exit(EXIT_FAILURE)로 프로그램을 종료합니다.
- fscanf() 함수가 numbers.txt에서 정수를 한 개씩 읽어 들이며, 더 이상 읽을 값이 없으면 반복이 종료됩니다.
- 읽어 들인 수가 prime() 함수를 통과하면 소수 파일에, 통과하지 못하고 even() 함수를 통과하면 짝수 파일에, 둘 다 아니면 홀수 파일에 fprintf()로 기록합니다.
- 모든 처리가 끝나면 fclose()로 네 개의 파일을 모두 닫고 완료 메시지를 출력합니다.
핵심 함수 살펴보기
even() 함수는 비트 AND 연산자(&)를 활용합니다. num & 1의 결과가 0이면 짝수이므로 !(num & 1)이 1을 반환합니다. 나머지 연산보다 빠르게 짝수 여부를 판별할 수 있는 방법입니다.
prime() 함수는 음수를 먼저 걸러낸 뒤, 2부터 num/2까지의 수로 차례대로 나누어 보고 나누어떨어지는 값이 하나라도 있으면 0을 반환합니다. 끝까지 약수가 발견되지 않으면 1을 반환해 소수임을 알립니다.
참고로 이 로직에서는 1도 소수로 분류됩니다. 반복 범위(2 ~ num/2)가 성립하지 않아 반복문이 실행되지 않고 곧바로 1을 반환하기 때문입니다. 그래서 실행 결과의 prime-numbers.txt에 1이 포함되어 있는 것입니다.