9주차: Using Files and Others
이 번 강의 내용 프로그램에서 파일을 사용하는 방법을 배운다. 예를 들어 성적 데이터 파일을 읽어 들여서 어떤 처리를 하는 경우...
파일이란? 파일 컴퓨터의 디스크에 저장되어 있는 어떤 객체 결국은 01011101....의 형태로 되어 있다. 프로그램, 데이터, ... 결국은 01011101....의 형태로 되어 있다.
디스크와 파일 파일 1 파일2 작은 파일 디스크의 빈 공간 어떤 하드 디스크
텍스트 파일 파일의 내용이 문자(char)로 되어 있는 파일 이진 파일(Binary file) 영어, 한글, 기호, ... C 프로그램의 원시 파일(source file) 이진 파일(Binary file) 실행 프로그램, ...
텍스트 파일 만들기 에디터 프로그램을 사용하면 된다. vi, 윈도우 메모장, 워드패드, 한글, ... 단, 한글이나 MS워드를 사용할 때에는 파일을 저장할 때 완성형 텍스트 형식으로 저장할 것
C에서 텍스트 파일을 사용 파일의 사용은 다음의 3단계를 거친다. 파일의 열기(Open) 파일의 사용(Using) 파일에서 뭔가를 읽어 들이기, 파일에 뭔가를 쓰기, ... 파일의 닫기(Close)
파일을 열기 -FILE *: 파일에 대한 포인터 타입 -ifile: 파일에 대한 포인터 변수, 파일에 대한 주소를 나타낸다고 생각하자. -fopen: 파일을 열고 그 파일에 대한 파일 포인터를 return하는 함수 -”data.txt”: 파일 이름 -”w”: 파일을 쓰기 모드로 연다. #include<stdio.h> int main(void) { FILE *ifile; ifile = fopen(“data.txt”, “w”); ... fclose(ifile) return 0; }
파일에서 데이터를 읽어 오기 fscanf 함수 fscanf(file pointer, ...) stdin 대신 file pointer에서 읽어 들인다.
데이터 텍스트 파일 1 35 2 98 234 987 45 3 예를 들어 왼쪽과 같이 생긴 데이터 파일(data.txt)에서 정수들을 쭉 읽어 들여 크기 순으로 화면에 출력하는 작업을 한다고 생각하자...(sorting)
우선 파일을 연다. “r”: 파일을 읽기 모드로 연다. #include<stdio.h> #include<stdlib.h> int main(void) { FILE *ifile; int num[100], num_cnt = 0; int i, j, tmp; ifile = fopen(“data.txt”, “r”); if(!ifile){ printf(“File open error!\n”); exit(1); } “r”: 파일을 읽기 모드로 연다. if(!ifile){...} 만일 ifile이 NULL이면 파일을 열지 못했으므로 프로그램의 수행을 중단한다. exit(1): 프로그램의 비정상적인 종료 stdlib.h: exit 함수를 쓰기 위해 include
이제 파일에서 데이터를 읽는다. while(fscanf(ifile, “%d”, &(num[num_cnt])) == 1) num_cnt++; fscanf 함수는 ifile에서 정수 하나를 읽어 num[num_cnt]에 넣고 제대로 읽어 들인 항목의 개수(이 경우는 1)를 return 한다. 마지막에는 읽어 들인 정수가 없으므로 0을 return하고 while 문을 빠져 나오게 된다. num_cnt는 읽어 들인 정수의 총 개수를 가진다.
읽은 정수들을 크기 순으로 다시 배열하자. i=0 i=1 i=2 ... for(i = 0; i < num_cnt; i++) for(j = i + 1; j < num_cnt; j++){ if(num[i] < num[j]){ tmp = num[i]; num[i] = num[j]; num[j] = tmp; } i=0 i=1 i=2 ... first first 2nd first 2nd 3rd
이제 배열을 출력하자! fclose(ifile): ifile이 가리키는 파일을 닫는다. printf(“Sorted numbers are...\n\n”); for(i = 0; i < num_cnt; i++) printf(“%5d”, num[i]); fclose(ifile); return 0; } fclose(ifile): ifile이 가리키는 파일을 닫는다.
함수의 인자로 배열을 사용하기 double sum(double a[], int n) { int i; double sum = 0.0; for(i = 0; i < n; i++) sum += a[i]; return sum; } -sum()은 인자로 double 배열 a와 a의 원소의 개수 n을 받아서 배열 a의 모든 원소들의 합을 구해서 return하는 함수이다.
교재에서 강의와 연관된 부분 6장 6.6 11장 11.3, 11.4