12장 파일처리와 매크로 파일 입출력 함수 문자 입출력 함수 라인 입출력 함수 불록 입출력 함수 매크로
파일처리 순서 파일처리 순서
파일 모드의 종류 02 파일 모드의 종류 mode 의미 읽기/쓰기 위치 "r" 읽기 용도로 파일을 연다 파일 시작 위치 "w" 쓰기 용도로 파일을 연다 "a" 추가 쓰기 용도로 파일을 연다. 파일 끝 위치 "r+" 파일을 갱신하기 위해 파일을 연다. "w+" 파일을 생성하고, 갱신 용도로 파일을 연다. "a+" 추가를 위한 파일의 읽기와 쓰기 용도로 연다.
파일 입출력 함수 03 파일 입출력 함수 구분 함수명 사용 예 열기와 닫기 열기 fopen() fp = fopen("data.txt", "r"); 닫기 fclose() fclose(fp); 입 출력 문자 입출력 fgetc(), fputc() ch = fgetc(fp); 라인 입출력 fgets(), fputs() fgets(str, 80, fp); 블록 입출력 fread(), fwrite() fread(&a, sizeof(a), 1, fp); 형식화된 입출력 fscanf(), fprintf() fscanf(fp, "%d", &a);
【예제 12-1】Ex1.c 02 문자를 파일에 출력 예제 01 #include <stdio.h> 02 #include <stdlib.h> 03 int main(void) 04 { 05 FILE* fp; 06 char ch; 07 if((fp = fopen("basic.txt", "w")) == NULL){ 08 printf("파일이 열리지 않습니다\n"); 09 exit(1); 10 } 11 printf("한 문자를 입력하세요.\n"); 12 ch = getchar(); 13 while(ch != 'q'){ 14 fputc(ch, fp); 15 ch = getchar(); 16 } 17 printf("파일 입력이 종료되었습니다.\n"); 18 return 0; 19 } 표준입력 스트림
문자 입출력 04 문자 입출력 fgetc( ): 파일에서 문자 한 자를 읽어오는 함수 fputc( ): 파일에 문자 한 자를 기록하는 함수 char fgetc( FILE* ) fgetc(char, FILE* ) 사용 예 : 사용 예 : char ch; char ch = 'a'; ch = fgetc(fp); ch = fputc(ch, fp);
라인 입출력 05 라인 입출력 fgets( ) 함수와 fputs( ) 함수: 한 라인을 읽어 배열에 저장하거나 출력하기 위해서 사용되는 함수 fgets( ) 함수: 파일의 한 줄의 내용을 읽어서 배열에 저장하는 함수 fputs( ) 함수: 배열의 내용을 파일에 기록하는 함수 char * fgets (char *, int , FILE *); char * fputs (char *, FILE *); 사용 예 : 사용 예 : FILE *fp; FILE *fp; char line[50]; char line[50] = “title"; fgets(line, 50, fp); fputs(line, fp);
【예제 12-2】Ex2.c 02 라인 입출력 예제 01 #include <stdio.h> 02 #include <stdlib.h> 03 #define LINE 30 04 int main(void) 05 { 06 FILE* fp1, *fp2; 07 char line[LINE]; 08 fp1 = fopen("lineInput.txt", "r"); 09 if (fp1 == NULL) 10 { 11 printf("파일을 열수 없습니다.\n"); 12 exit(1); 13 } 14 fp2 = fopen("linetarget.txt", "w"); 15 while ( fgets(line, LINE, fp1) != NULL) 16 fputs(line, fp2); 17 fclose(fp1); 18 fclose(fp2); 19 return 0; 20}
블록 입출력 06 블록 입출력 일정한 블록의 단위로 입력하여 지정된 곳에 저장하거나 출력하기 위해서 사용 size 함수명 (void* 포인터, 바이트 크기, 블록수, FILE* 포인터); 사용 예 : fread(&a, sizeof(a), 1, fp); fwirte(&b, sizeof(b), 1, fp);
【예제 12-3】Ex3.c 02 블록 입출력 예제 01 #include <stdio.h> 02 #include <stdlib.h> 03 04 int main(void) 05 { 06 FILE* fp; 07 int n = 4000; 08 if((fp = fopen("basic.txt", "wb")) == NULL) 09 { 10 printf("파일을 열수 없습니다.\n"); 11 exit(1); 12 } 13 fwrite(&n, sizeof(int), 1, fp); 14 15 fclose(fp); 16 return 0; 17 } 표준입력 스트림
【예제 12-4】Ex4.c 02 01 #include <stdio.h> 02 #include <stdlib.h> 03 struct students{ 04 char name[40]; 05 char address[40]; 06 int age; 07 }; 08 typedef struct students student; 09 int main(void) 10 { 11 FILE* fp1; 12 student st1 = { "홍길동", "서울", 30}, st2; 13 if((fp1 = fopen("basic.txt", "w")) == NULL) 14 { 15 printf("파일이 열리지 않습니다.\n"); 16 exit(1); 17 } 18 fprintf(fp1, "%s %s %d\n", st1.name, st1.address, st1.age); 19 fclose(fp1); 20 if((fp1 = fopen("basic.txt", "r")) == NULL) 21 { 22 printf("파일이 열리지 않습니다.\n"); 23 exit(1); 24 } 25 fscanf(fp1, "%s %s %d\n", st2.name, st2.address, &st2.age); 26 printf("이름 : %s 거주지 : %s 나이 : %d\n\n", st2.name, st2.address, st2.age); 27 fclose(fp1); 28 return 0; 29 }
파일 임의 접근 07 파일 임의 접근 fseek( ) 함수 형식 int *fseek(FILE* fp, long offset, int origin) 첫 번째 인자 : 파일 포인터 두 번째 인자 : origin으로부터 파일이 떨어져 바이트 수를 나타냄 세 번째 인자 : 파일 위치를 가리키는 인자로 <stdio.h>에 정의 됨 반환 값 : 성공할 경우 0, 오류 발생시 0이외의 값 하는 일 파일의 위치 지시자를 origin을 기점으로 offset 바이트만큼 이동 상 수 값 의 미 SEEK_SET 파일의 선두 위치 SEEK_CUR 1 파일에서 현재 위치 SEEK_END 2 파일의 끝
【예제 12-5】Ex5.c 02 01 #include <stdio.h> 02 #include <string.h> 03 #include <stdlib.h> 04 int main(void) 05 { 06 FILE* fp; 07 char str[10]; 08 if((fp = fopen("data.txt", "wb")) == NULL) 09 { 10 printf("파일이 열리지 않습니다.\n"); 11 exit(1); 12 } 13 fprintf(fp, "abcdefghij"); 14 fclose(fp); 15 if((fp = fopen("data.txt", "rb")) == NULL) 16 { 17 printf("파일이 열리지 않습니다.\n"); 18 exit(1); 19 } 20 fgets(str, 11, fp); 21 printf("str 문장 출력 : %s \n", str); 22 fseek(fp, 4L, SEEK_SET); 23 fgets(str, 3, fp); 24 printf("4번째부터 2글자 출력 : %s \n", str); 25 fseek(fp, -3L, SEEK_CUR); 26 fgets(str, 3, fp); 27 printf("현재의 위치에서 앞에 3글자부터 2글자 출력 : %s \n", str); 28 fseek(fp, -9L, SEEK_END); 29 fgets(str, 5, fp); 30 printf("맨 뒤에서 9번째 앞에서부터 4글자 출력 : %s \n", str); 31 fclose(fp); 32 return 0; 33 } 표준입력 스트림
파일 임의 접근 07 fgetpos( ) 함수 형식 int *fgetpos(FILE* fp, long* pos); 첫 번째 인자 : 파일 포인터 두 번째 인자 : 파일 위치 지시자 값을 저장하는 포인터 반환 값 : 성공할 경우 0, 오류 발생시 0이외의 값 하는 일 파일 위치 지시자 값을 pos가 가리키는 곳에 넣음 fsetpos( ) 함수 형식 int *fsetpos(FILE* fp, const long* pos); 두 번째 인자 : 파일 위치 지시자의 값을 주는 포인터 pos가 가리키는 값을 파일 위치 지시자 값으로 넣음
【예제 12-6】Ex6.c 02 01 #include <stdio.h> 02 #include <string.h> 03 #include <stdlib.h> 04 int main(void) 05 { 06 07 FILE* fp; 08 fpos_t pos; 09 char str[30]; 10 if((fp = fopen("12-5.c", "rb")) == NULL) 11 { 12 printf("파일이 열리지 않습니다.\n"); 13 exit(1); 14 } 15 fgetpos(fp, &pos); 16 printf("pos = %ld \n", pos); 17 fread(str, sizeof(char), 30, fp); 18 fgetpos(fp, &pos); 19 printf("pos = %ld, str = %s\n", pos, str); 20 pos = 500; 21 if(fsetpos(fp, &pos) != 0) 22 printf("fsetpos 에러 발생\n"); 23 fread(str, sizeof(char), 30, fp); 24 fgetpos(fp, &pos); 25 printf("pos = %ld, str = %.30s \n", pos, str); 26 fclose(fp); 27 return 0; 38 } 표준입력 스트림
매크로 08 매크로 프로그램 작성시 반복적으로 나타나는 명령들을 하나의 새로운 명령으로 정의 할 수 있도록 해주는 것 C 언어에서 매크로 지시어는 #define 으로 나타냄 #define 매크로명 리스트명 수, 문자열 등 사용 예 : #define PI 3.141592 #define MSG "Hello!!"
【예제 12-7】Ex7.c 02 매크로 상수 예제 01 #include <stdio.h> 02 #define PI 3.14 03 int main(void) 04 { 05 int R; 06 float cir; 07 08 printf("원의 반지름을 입력하세요 : "); 09 scanf("%d", &R); 10 11 cir = PI * (2 * R); 12 printf("원의 둘레는 %.2f 입니다.\n", cir); 13 14 return 0; 15 } 표준입력 스트림
【예제 12-8】Ex8.c 02 매크로 함수 예제 01 #include <stdio.h> 02 #define PI 3.14 03 #define AREA(X) (PI * (X) * (X)) 04 int main(void) 05 { 06 float R; 07 08 printf("원의 반지름을 입력하세요 : "); 09 scanf("%f", &R); 10 11 printf("원의 면적은 %.2f 입니다.\n", AREA(R)); 12 13 return 0; 14 } 표준입력 스트림