제 9장 입력과 출력 Hello!! C 언어 강성호 김학배 최우영
순서 표준 입출력 함수 printf()와 scanf() getchar()와 putchar() gets()과 puts() 제 9장 입력과 출력 표준 입출력 함수 printf()와 scanf() getchar()와 putchar() gets()과 puts() 파일 입출력 함수 fopen()과 fclose() 서식 입출력 함수 fprintf()와 fscant() fgetc()와 fputs() fgets()와 gputs() 구역 입출력 함수 fread()와 fwrite() 랜덤 엑세스 함수 fseek()와 ftell() 파일조작에 관한 I/O 함수 요약
표준 입출력 함수 스트림(stream) 종류 파일(file) 제 9장 입력과 출력 스트림(stream) C 언어의 입출력 시스템에서 프로그래머와 사용되는 장치와의 추상화 개념 종류 텍스트 스트림(text stream) : 인쇄가 가능한 문 자들의 연속. 각 줄의 끝에 `/n'가 입력됨. 이진 스트림(binary stream) : 외부 장치에서의 바이트에 일대일 대응되는 바이트들의 연속. 아 무런 문자 번역이 발생하지 않음. 파일(file) 실제 입출력 장치를 논리적 개념으로 간주하여 파일이라 함. open 연산으로 스트림을 특정 파일과 연결. close 연산을 사용하여 특정 스트림과의 관계를 끊음. exit() 함수를 호출하면 모든 파일들을 자동적으로 종결시킴.
표준 입출력 함수 표준 입출력 장치 표준 입출력 함수 제 9장 입력과 출력 표준 입출력 장치 표준 입출력 함수 지시된 기억 장소에 데이터를 키보드로부터 직접 입력하거나 입력된 데이터를 모니터에 출력하는 역할을 담당하는 함수. 이와 같은 표준 입출력 함수들은 "stdio.h"라는 헤더 파일에 저장됨.
printf()와 scanf() printf() 함수 printf()의 사용 형식 제 9장 입력과 출력 printf() 함수 데이터를 원하는 서식에 맞추어 화면에 출력하는 함수. print formatted의 의미. printf()의 사용 형식 오른쪽에 있는 인수들을 서식 문자열 내의 변환 문자의 형태로 바꾸어 화면에 출력함. printf(서식 문자열, 인수들);
printf()와 scanf() 변환 문자 %d : int 형의 값을 십진수로 바꾸어줌 제 9장 입력과 출력 변환 문자 %d : int 형의 값을 십진수로 바꾸어줌 %ld : long 형의 값을 십진수로 바꾸어줌 %x : int 형의 값을 16진수로 바꾸어줌 %lx : long 형의 값을 16진수로 바꾸어줌 %o : int 형의 값을 8진수로 바꾸어줌 %lo : long 형의 값을 8진수로 바꾸어줌 %u : unsigned 형을 십진수로 바꾸어줌 %lu : long unsigned 형을 십진수로 바꾸어줌 %e : 부동 소수점수를 지수형으로 나타내줌 %f : 부동 소수점수를 고정소수점수로 나타내줌 %g : 부동 소수점수를 %e와 %f중 간단한 것으로 나타내줌 %p : 포인터형 값으로 나타내줌 %c : 바이트 값을 문자로 바꾸어줌 %s : 문자열로 바꾸어줌
printf()와 scanf() [예제 9-1] printf("%5d", a); [실 행 결 과] 1234567 제 9장 입력과 출력 [예제 9-1] printf("%5d", a); [실 행 결 과] 1234567
printf()와 scanf() [예제 9-2] #include <stdio.h> main() { 제 9장 입력과 출력 [예제 9-2] #include <stdio.h> main() { float a, b; a = 15.0; b = 3.0; printf("덧 셈 = %8.2f\n", a+b); printf("뺄 셈 = %8.2f\n", a-b); printf("곱 셈 = %8.2f\n", a*b); printf("나눗셈 = %8.2f\n", a/b); } [실행 결과] 덧 셈 = 18.00 뺄 셈 = 12.00 곱 셈 = 45.00 나눗셈 = 5.00
printf()와 scanf() scanf() 함수 scanf()의 사용 형식 제 9장 입력과 출력 scanf() 함수 키보드로부터 서식에 맞추어 다양한 형태의 데이터를 입력받는 함수. scanf()의 사용 형식 printf()와는 반대로 행 지정 입력을 수행함 서식 문자열의 위치에 일반적인 문자열이나 제어 문자는 기술할 수 없고 오직 변환 문자만 사용할 수 있음 일반 변수의 인수에는 참조 호출(call by reference) 방식으로 데이터를 전송하므로 변수의 주소를 나타내는 &를 사용하여 변수의 주소임을 나타내야 함. scanf(서식 문자열, 인수들); 예제 9-3, 예제 9-4 참조
printf()와 scanf() [예제 9-3] #include <stdio.h> main() { int a, b; 제 9장 입력과 출력 [예제 9-3] #include <stdio.h> main() { int a, b; float average; printf("input data = "); scanf("%d %d", &a, &b); average = (a+b)/2; printf("average of two numbers = %f\n",average); } [실 행 결 과] input data = 10, 20 average of two numbers = 15.000000
printf()와 scanf() [예제 9-4] #include <stdio.h> main() { 제 9장 입력과 출력 [예제 9-4] #include <stdio.h> main() { float x, y, average = 0.0; printf("input data(x, y) = "); scanf("%f %f", &x, &y); printf("sum of two numbers = %f\n", x+y); printf("average of two numbers = %f\n", (x+y)/2); } [실 행 결 과] input data(x, y) = 10.0 20.0 sum of two numbers = 30.000000 average of two numbers = 15.000000
getchar()와 putchar() getchar() 함수 putchar() 함수 형식 제 9장 입력과 출력 getchar() 함수 키보드로부터 한 문자를 읽어들여 실행중인 프로 그램에 전달. putchar() 함수 프로그램에서 한 문자를 받아 화면에 출력. 형식 char ch; ch = getchar(); putchar(ch);
getchar()와 putchar() [예제 9-5] #include <stdio.h> main() { 제 9장 입력과 출력 [예제 9-5] #include <stdio.h> main() { char str; str = getchar(); putchar(str); putchar('\n'); putchar('A'); } [실 행 결 과] d A
getchar()와 putchar() [예제 9-6] #include <stdio.h> main() { 제 9장 입력과 출력 [예제 9-6] #include <stdio.h> main() { char str; str = getchar(); while(str != EOF) { putchar(str); str=getcjar(); } [실 행 결 과] example ABCD EFG 1234567 ^Z
gets()과 puts() gets() 함수 puts() 함수 형식 키보드에서 지시한 문자열을 지시된 버퍼에 저장 제 9장 입력과 출력 gets() 함수 키보드에서 지시한 문자열을 지시된 버퍼에 저장 scanf() 함수와의 차이점 scanf() 함수는 공백 혹은 <Enter>에 의해서 입력의 끝을 저장하나, gets()은 입력의 끝으로 <Entert>만을 받아들임 버퍼의 크기 : 예상되는 최대 문자수 + 1 입력의 끝에 NULL이 부과됨. puts() 함수 버퍼의 문자열을 NULL이 나올 때까지 화면에 출력 형식 char name[10]; gets(name); puts(name);
gets()과 puts() [예제 9-7] #include <stdio.h> main() { 제 9장 입력과 출력 [예제 9-7] #include <stdio.h> main() { char name[15], irum[15]; gets(name); scanf("%s", irum); printf("name = %s\n", name); printf("irum = %s\n", irum); } [실 행 결 과] name = Hong Gil Dong irum = Hong
gets()과 puts() [예제 9-8] #include <stdio.h> main() { char ch[15]; 제 9장 입력과 출력 [예제 9-8] #include <stdio.h> main() { char ch[15]; gets(ch); printf("%s", ch); puts(ch); } [실 행 결 과] Hong Gil DongHong Gil Dong
입출력 함수 제 9장 입력과 출력 표준 입출력 함수 프로그램 실행중 주기억 장치 내로 데이터를 입력하거나 저장된 데이터를 출력할 경우 입출력장치로서 주로 키보드와 화면을 이용한 방법. 컴퓨터를 끄거나 실행 파일에서 빠져 나오면 주기억 장치에서는 실행된 결과가 지워져 버림. 파일 입출력 함수 보조 기억 장치인 디스크에서 입력 자료를 읽어와 출력 결과를 파일 단위로 디스크에 저장하는 기능을 지닌 함수. 입력 자료나 실행 결과의 보존은 반영구적. 데이터가 미리 저장되어 있는 자료 파일 : "data.in” 출력으로 저장할 정보 파일 : "data.out” 자료의 처리를 위한 프로그램 : "main.c” 파일 입출력을 위해 3개의 파일이 필요.
파일 입출력 함수 제 9장 입력과 출력 종류
fopen()과 fclose() fopen() 함수 형식 용도 제 9장 입력과 출력 fopen() 함수 용도 filename으로 지정된 파일을 mode로 지정된 형태 로 열게 됨. 형식 FILE *fopen(filename, mode) const char *filename; const char *mode; / * 인수 filename : 개방하고자 하는 파일 이름 */ /* 인수 mode : 파일에 대한 처리 종류 지정 모드 */
fopen()과 fclose() 제 9장 입력과 출력 파일 개방 모드
fopen()과 fclose() [예제 9-9] FILE *in, *out; 제 9장 입력과 출력 [예제 9-9] FILE *in, *out; in = fopen("example.in", "r"); out = fopen("example.out", "w");
fopen()과 fclose() fclose() 함수 형식 exit() 함수 제 9장 입력과 출력 fclose() 함수 용도 : 사용한 파일을 닫고자 할 때, 지정된 파일 포인 터와 연결된 외부 파일을 단절하기 위해 사용. 형식 int fclose(fptr); FILE *fptr; /* 인수 fptr : 파일 포인터 */ exit() 함수 파일을 닫는 기능 수행. 현재 열려 있는 모든 파 일을 닫음.
fopen()과 fclose() [예제 9-10] #include <stdio.h> main() { 제 9장 입력과 출력 [예제 9-10] #include <stdio.h> main() { FILE *in, *out; /* 파일 포인터 변수 선언 */ /* 사용할 파일의 개방 */ in = fopen("example.in", "r"); out = fopen("example.out", "w"); … /* 사용했던 파일의 폐쇄 */ fclose(in); fclose(out); }
서식 입출력 함수 fprintf()와 fscant() 제 9장 입력과 출력 fprintf() 함수 용도 : 디스크 파일을 대상으로 printf() 함수와 같은 기능을 수행 형식 int fprintf(fptr, format, argument list); FILE *fptr; const char *format; /* 인수 fptr : 파일 포인터 */ /* 인수 format : 서식 문자열 */ printf() 함수와의 관계 fprintf(stdout, format, argument list); printf(format, argument list);
서식 입출력 함수 fprintf()와 fscant() 제 9장 입력과 출력 fscanf() 함수 용도 : 디스크 파일을 대상으로 scanf() 함수와 같은 기능을 수행. 형식 int fscanf(fptr, format, argument list); FILE *fptr; const char *format; /* 인수 fptr : 파일 포인터 */ /* 인수 format : 서식 문자열 */ scanf() 함수와의 관계 fscanf(stdin, format, argument list); scanf(format, argument list);
서식 입출력 함수 fprintf()와 fscant() 제 9장 입력과 출력 [예제 9-11] #include <stdio.h> #include <stdlib.h> main() { int kor, eng, mat, total; float average; FILE *in, *out; in = fopen("example.in", "r"); out = fopen("example.out", "w"); if( in == NULL){ printf("File not found!!!"); exit(1); } 계속
서식 입출력 함수 fprintf()와 fscant() 제 9장 입력과 출력 [예제 9-11] 계속 fprintf(out, " *********** 성 적 표 *********** \n"); fprintf(out, " 국 어 영 어 수 학 총 점 평균 \n\n"); while( fscanf(in, "%d %d %d", &kor, &eng, &mat) != EOF ){ total = kor + eng + mat; average = total/3; fprintf(out, "%6d %8d %9d %8.2f\n", kor, eng,mat, total, average); } fclose(in); fclose(out); 계속
서식 입출력 함수 fprintf()와 fscant() 제 9장 입력과 출력 [예제 9-11] 계속 [실 행 결 과] *********** 성 적 표 *********** 국 어 영 어 수 학 총 점 평 균 80 80 80 240 80.00 90 95 85 270 90.00 70 75 65 210 70.00 90 75 100 265 88.33
fgetc()와 fputc() fgetc() 함수 형식 용도 : 파일에서 한 글자를 입력하는 함수 제 9장 입력과 출력 fgetc() 함수 용도 : 파일에서 한 글자를 입력하는 함수 지정한 파일에서 한 문자를 읽어서 int형으로 되돌리고 파일 포인터를 하나 증가시킴. 형식 int fgetc(fptr); FILE *fptr; /* 인수 fptr : 파일 포인터 */
fgetc()와 fputc() fputc() 함수 형식 예제 9-12 용도 : 파일에서 한 글자를 출력하는 함수 제 9장 입력과 출력 fputc() 함수 용도 : 파일에서 한 글자를 출력하는 함수 형식 int fputc(ch, fptr); FILE *fptr; char ch; /* 인수 fptr : 파일 포인터 */ /* 인수 ch : 문자 변수 */ 예제 9-12 fgetc()와 fputc() 함수를 이용하여 임의의 파일 내용을 다른 파일로 출력하는 파일 복사 프로그램.
fgetc()와 fputc() [예제 9-12] #include <stdio.h> 제 9장 입력과 출력 [예제 9-12] #include <stdio.h> #include <stdlib.h> main(){ char ch; FILE *in, *out; in = fopen("example.c", "r"); if(in== NULL) { printf("File not found!!!\n") exit(1) } out = fopen("copy.c", "w"); while((ch = fgetc(in)) != EOF) fputc(ch, out); [실 행 결 과] fclose(in); 위 프로그램을 실행시키면 example.c" fclose(out); 파일을 복사하여 copy.c" 파일이 같은 } 디렉토리에 생성된다.
fgets()와 fputs() fgets() 함수 형식 용도 : 스트림으로부터 문자열을 읽어들이는 함수 제 9장 입력과 출력 fgets() 함수 용도 : 스트림으로부터 문자열을 읽어들이는 함수 파일로부터 한 줄을 읽어 s에 저장 개행문자(‘\n’)나 EOF을 만날 때까지 파일로부터 읽음 읽어온 데이터의 끝에 NULL 문자를 붙여줌. 형식 char *fgets(s, n, fptr); char *s; int n; FILE *fptr; /* 인수 s : 입력 문자열을 저장하는 버퍼 */ /* 인수 n : 입력 최대 문자수 */ /* 인수 fptr : 파일 포인터 */
fgets()와 fputs() fputs() 함수 형식 용도 : 스트림으로부터 지정된 파일에 버퍼로부터 문자열을 출력하는 함수 제 9장 입력과 출력 fputs() 함수 용도 : 스트림으로부터 지정된 파일에 버퍼로부터 문자열을 출력하는 함수 스트림으로 지정된 파일에 s가 가리키는 문자열 자료를 출력. 형식 int fputs(s, fptr); char *s; FILE *fptr; /* 인수 s : 출력할 문자열 */ /* 인수 fptr : 파일 포인터 */
fgets()와 fputs() [예제 9-13] /* filename : input.c */ 제 9장 입력과 출력 [예제 9-13] /* filename : input.c */ The limits in your life are the size of your ideas and your degree of determination. #include <stdio.h> main(){ char buf[256]; FILE *in, *out; int cnt = 0; in = fopen("input.c", "r"); out = fopen("output.c", "w"); while(fgets(buf, 256, in) != NULL) { fputs(buf, out); ++cnt; } 계속
fgets()와 fputs() [예제 9-13] 계속 제 9장 입력과 출력 [예제 9-13] 계속 printf("This file includes %d lines.\n", cnt); fclose(in); fclose(out); } [실 행 결 과] 이 프로그램을 실행시키면 다음 문장이 화면에 나타난다. This file includes 2 lines. 또한, "output.c" 파일을 보면 input.c" 파일과 동일한 내용을 포함하고 있음을 알 수 있다.
구역 입출력 함수 fread()와 fwrite() 제 9장 입력과 출력 fread() 함수 용도 : 이진 스트림 전용 함수로서 스트림의 파일 포인터에서 각각 n 바이트 크기를 갖는 cnt 개의 데이터 항목을 포인터 buf가 가리키는 구역으로 읽어들임 형식 int fread(buf, n, cnt, fptr); void *buf; int n; int cnt; FILE *fptr; /* 인수 buf : 반환 포인터 */ /* 인수 n : 자료 구역 크기 */ /* 인수 cnt : 반환 구역수 */ /* 인수 fptr : 파일 포인터 */
구역 입출력 함수 fread()와 fwrite() 제 9장 입력과 출력 fwrite() 함수 용도 : 이진 스트림 전용 함수로서 포인터가 가리키는 구역을 스트림의 파일 포인터에 출력 형식 int fwrite(buf, n, cnt, fptr); char *buf; int n; int cnt; FILE *fptr; /* 인수 buf : 기록될 정보에 대한 포인터 */ /* 인수 n : 자료 구역 크기 */ /* 인수 cnt : 기록될 구역수 */ /* 인수 fptr : 파일 포인터 */
구역 입출력 함수 fread()와 fwrite() 제 9장 입력과 출력 [예제 9-14] #include <stdio.h> main() { FILE *fp; float f = 10.05; if((fp = fopen("test.c", "wb")) == NULL) printf("cannot open file!\n"); return; } fwrite(&f, sizeof(float), 1, fp); fclose(fp);
랜덤 엑세스 함수 fseek()와 ftell() 제 9장 입력과 출력 fseek() 함수의 형식 int fseek(fptr, offset, whence); FILE *fptr; long int offset; int whence; /* 인수 fptr : 파일 포인터 */ /* 인수 offset : 원하는 위치로 이동하기 위한 바이트수 */ /* 인수 whence : offset 시작점 */
랜덤 엑세스 함수 fseek()와 ftell() 제 9장 입력과 출력 Fseek() 함수 용도 : 파일 포인터의 위치를 사용자가 원하는 지점으로 이동하는 함수로서 파일 내의 원하는 지점에 포인터를 놓은 후, 그 지점에 수록된 내용을 읽거나 처리할 수 있기 위한 함수 offset과 whence offset 파일 포인터가 가리키는 위치로부터 원하는 지점으로 이동하기 위한 바이트수 반드시 long형으로 기술 whence 현재 파일 포인터가 가리키고 있는 시작점 0 : 파일의 맨 처음 위치(SEEK_SET) 1 : 파일 내의 현재 위치(SEEK_CUR) 2 : 파일의 맨 끝 위치(SEEK_END)
랜덤 엑세스 함수 fseek()와 ftell() 제 9장 입력과 출력 ftell() 함수 형식 long int ftell(fptr); FILE *fptr; /* 인수 fptr : 파일 포인터 */ 용도 파일 포인터의 현재 위치를 나타내는 함수로서 파일의 시작 위치로부터 현재 파일 포인터가 있는 곳까지의 바이트 수를 반환. 예제 9-15 무작위로 번호, 이름, 점수를 입력받아 랜덤 파일 을 만드는 과정을 나타낸 프로그램
랜덤 엑세스 함수 fseek()와 ftell() 제 9장 입력과 출력 [예제 9-15] #include <stdio.h> main() { long int num, score, size = 16L; static char name[11], ch; FILE *out; out = fopen("random.dat", "w"); while(1){ printf("\n 번호, 이름(최대 10자리), 점수\n"); scanf("%1d %10s %3d", &num, &name, &score); fseek(out, (num-1)*size, 0); fprintf(out, "%3d %10s %3d", num, name, score); printf("계속 입력 ? (Y/N)"); ch = getchar(); 계속
랜덤 엑세스 함수 fseek()와 ftell() 제 9장 입력과 출력 [예제 9-15] 계속 if((ch == 'Y' || ch == 'y') continue; else break; } fclose(out); [입력 데이터] 4 홍길동 80 2 이몽룡 95 1 성춘향 72 3 임꺽정 98 [실 행 결 과] random.dat 에 다음과 같은 내용이 써진다. 1 성춘향 72 2 이몽룡 95 3 임꺽정 98 4 홍길동 80