170 likes | 437 Views
포인터 초기화. 포인터 변수에는 사용자가 직접 주소를 저장할 수 없다 . NULL 상수는 예외 int *ptr = 10000; ---(X) int *ptr = NULL; ---(O) NULL 상수 포인터의 초기화 값으로 주로 사용되며 포인터가 어떤 메모리도 가리키고 있지 않다는 의미로서 이용. int *ptr = NULL; ~ if ( ptr == NULL ) { printf(“ 그런 사람은 없습니다 .”); } else printf(“%s”, *ptr);.
E N D
포인터 초기화 • 포인터 변수에는 사용자가 직접 주소를 저장할 수 없다. • NULL 상수는 예외 int *ptr = 10000; ---(X) int *ptr = NULL; ---(O) • NULL 상수 • 포인터의 초기화 값으로 주로 사용되며 포인터가 어떤 메모리도 가리키고 있지 않다는 의미로서 이용 int *ptr = NULL; ~ if ( ptr == NULL ) { printf(“ 그런 사람은 없습니다.”); } else printf(“%s”, *ptr);
int * n n++후 n++후 10.2 포인터 변수의 연산 • 포인터 + 1 또는 포인터 -1 포인터의 “형” 에 따라 증가(감소)되는 값이 달라진다. 즉 (포인터가 가리키는) 자료형이 실제로 메모리를 차지하는 크기만큼 증가됨 int형 포인터 4 double형 포인터 8 char형 포인터 1 1 2 3 형 *포인터; : 포인터++; 포인터는 바로 다음 장소를 가리키게 됨다. 4 5 6
no, dp 포인터의 1 증가와 1 감소 • double형 포인터라면 8byte씩 증가 double * dp; double no[3] dp = no; 1.0 (1) • dp++후 (1) (2) 2.0 dp++후 (2) 3.0
95 88 76 54 85 82 10.3 포인터와 배열 point가 가리키는 자료형인 int 형 자료 1개 크기(4bytes)만큼 덧셈이 됨 • 배열명 • 배열의 첫번째 원소를 가리키는 포인터 • int point[] = {95, 88, 76, 54, 85, 82}; point 100번지 95 88 76 • 결과는? • printf(“%d \n”, *point); • printf(“%d \n”, *(point+1)); • printf(“%d \n”, *(point+2)); 100(번지)
예제 10.6 프로그램 a P 1310572 1310576 1310580 1310584 1310588 a[0] a[1] a[2] a[3] a[4] 6 : int a[5] = {111, 222, 333, 444, 555 }; 7 : int *p = a; 8 : int i; 15 : 16 : for(i=0; i<5; ++i) { 17 : printf(“ … %d, … %d", a[i], *(p+i)); 19 : } 20 :
95 88 76 54 85 82 배열과 포인터 • 배열의 원소를 몇 배로 만드는 함수 timesAry(int ary[], int times) 100번지 num • double aveAry( int ary[], int size); • void main() { • int num[] = {95, 88, 76, 54, 85}; • timesAry( num, 3 ); • for (i = 0; i < 5; i++) • printf(“%3d”, num[i]); • } • double timesAry( int ary[], int times) { • for (i = 0; i < 5; i++) • ary[i] = ary[i] * times; • } int * ary ary *(ary+i) = *(ary+i) * times
scanf() printf() 응용프로그램 (변수) 키보드 모니터 fscanf()를 사용하여 파일에서 읽어오기 fprintf()를 사용하여 파일에 쓰기 데이터파일 데이터파일 응용프로그램 (변수) read write 12장 파일 처리 • 콘솔을 이용한 입출력 • 파일을 이용한 입출력
순차적 파일 처리 • 파일(file) • 프로그램 파일 : 데이터를 처리할 명령어 집합 예) 성적처리프로그램, 도서관리프로그램 등 • 데이터 파일 : 프로그램에서 사용될 자료 집합(관련된 레코드들의 집합) 예) 학생들의 주소파일, 성적파일, 도서목록, 회원 정보 파일, 실험결과자료 등 • 파일 포인터 • 파일을 사용하려면 파일마다 파일 포인터가 지정되어야 함 • 파일 포인터 선언 FILE *파일포인터;
12.3 파일의 열기와 닫기 파일은 사용 전에 open하고 사용이 끝난 후에는 close하여야 함 1. 파일의 열기 파일포인터 = fopen(“파일명”, “파일접근방식”); • “파일접근방식” “w” : 프로그램에서 파일로 기록하기 “파일명”에 해당하는 파일이 존재하지 않는다면 이 이름의 파일이 새로 만들어지며, 이미 존재한다면 그 내용은 모두 사라진 후 새로 기록됨 “r” : 파일로 부터 프로그램으로 읽어오기 “a” : 추가용으로 파일의 끝에 새로운 내용을 추가 “파일명”에 해당하는 파일이 존재하지 않는다면 이 이름의 파일이 새로 만들어짐
12.3 파일의 열기와 닫기 파일이 제대로 열리지 않았다면 파일포인터에는 NULL이 저장된다. fp=fopen(“testfile.txt”, “r”); if (fp== NULL) printf(“그런 파일이 없습니다.”); else { … } 2. 파일의 닫기 fclose(파일포인터); 이후로 이 파일포인터는 재사용가능 즉, 새로 열리는 (다른)파일의 파일포인터로 사용가능
파일에 쓰기 : fprintf() fprintf(파일포인터, “출력양식”, 출력자료리스트); 여기의 내용이 차례로 출력양식에 맞게 파일포인터로 지정된 파일에 기록된다. • ① FILE * fp = fopen(“member.txt”, “w”); • no=1; • age=20; • ② fprintf(fp, “%3d %3d”, no, age); • fclose(fp); 사용자 작성 프로그램 member.txt ① 1 20 FILE * fp ② int no 1 int age 20
파일에 쓰기 예제 fprintf(파일포인터, “출력양식”, 출력자료리스트); • 학생의 번호, 이름, 평균을 “grade.txt”에 저장하기 int no=1; double ave=97.8; char name[7]=“홍길동”; FILE *fp; fp=fopen(“grade.txt”, “w”); fprintf(fp, "%2d %-10s %7.2lf \n", no, name, ave); fclose(fp); 주) 빈칸, ‘\t’, ‘\n’과 같은 데이터 구분자를 넣어줘야 다음에 이 파일에서 읽기를 할 때 데이터간 구분을 할 수 있다.
파일에 쓰기 예제 • 여러 명(SIZE)의 번호, 이름, 평균이 저장된 각각의 배열의 내용을 “stdArray.txt”에 저장하기 int no[SIZE]={1, 2, 3, 4, 5}; char name[SIZE][7]={“홍길동”,”성춘향”,“이몽룡”,“김갑돌”,“김갑순”}; double mean[SIZE] = {80.5, 93.5, 65.9, 88.7, 90.0}; fp=fopen(“stdArray.txt", “w"); for (i=0; i < SIZE; i++) fprintf(fp, "%2d %-10s %7.2lf \n", no[i],name[i],mean[i]); fclose(fp); • “a”로 하면 “stdArray.txt”파일의 끝에 새로 내용이 추가됨
파일에서 읽어 오기 : fscanf() fscanf(파일포인터, “입력양식”, 입력변수주소리스트); 여기의 내용이 차례로 출력양식에 맞게 파일포인터로 지정된 파일에 기록된다. • ① FILE * fp = fopen(“member.txt”, “r”); • fscanf(fp, “%d %d”, &no, &age); • printf(“번호:%d, 나이:%d\n”, no, age); • fclose(fp); 사용자 작성 프로그램 member.txt 모니터 ① 번호:1, 나이:20 1 20 FILE * fp ② int no 1 int age 20
student.txt의 내용 1 홍길동 80.5 2 성춘향 93.5 3 이몽룡 65.9 4 김갑돌 88.7 5 김갑순 90.0 ^Z(파일의 끝) 파일에서 읽어오기 예제 1 / 노트 • “student.txt”로부터 학생의 자료를 읽어서 모니터에 표시하기 char name[7]; int no; double mean; FILE *fp; _________________________________ for (i=0 ; i < 5 ; i++) { _______________________________________ ; printf("%2d %-10s %7.2lf \n",no, name, mean); } fclose(fp); fp=fopen("student.txt", "r"); fscanf(fp, "%d %s %lf", &no, name, &mean); • 파일로부터 읽은 자료를 정렬하고자 한다면?no, name, mean은 for 문안에서 반복될 때마다 새로운 자료로 바뀌므로 모든 정보를 비교해가며 수행해야하는 정렬 작업을 할 수 없다. 그렇다면 어떻게?
student.txt의 내용 1 홍길동 80.5 2 성춘향 93.5 3 이몽룡 65.9 4 김갑돌 88.7 5 김갑순 90.0 파일에서 읽어오기 예제 2 / 노트 • 파일로부터 읽은 자료를 성적순으로 정렬하고자 한다면?배열을 선언하고 파일의 내용을 배열에 저장한 후 정렬한다. 1. “student.txt”로부터 학생의 자료를 읽어서 배열에 저장하기 char name[SIZE][7]; int no[SIZE]; double mean[SIZE]; FILE *fp; fp=fopen("student.txt", "r"); for (i=0 ; i < SIZE ; i++) { fscanf(fp, "%d %s %lf", &no[i], name[i], &mean[i]); printf("%2d %-10s %7.2lf \n", no[i], name[i], mean[i]); } fclose(fp); 파일에 저장되어 있는 정보가 프로그램의 name, no, mean 배열에 모두 저장되어 있으므로 이 배열을 이용하여 원하는 처리를 할 수 있다.
파일에서 읽어오기 예제 2 / 노트 2. 정렬하기 for ( pass=1 ; pass < SIZE ; pass++) for (i=0 ; i < SIZE-pass ; i++) { if (mean[i]<mean[i+1]) { mean[i]와 mean[i+1]을 교환 name[i]와 name[i+1]도 교환 no[i]와 no[i+1]도 교환 } } 3. 출력하기 for (i=0 ; i < SIZE-pass ; i++) printf("%2d %-10s %7.2lf \n", no[i], name[i], mean[i]); no, name, mean 배열의 내용은 바뀌었지만 파일의 원본 내용은 그대로 있다.