1 / 65

입출력문 입력 함수 scanf() 출력 함수 printf() 파일 입출력 파일의 임의적 접근 : ftell(), fseek()

제 11 장 입력과 출력. 입출력문 입력 함수 scanf() 출력 함수 printf() 파일 입출력 파일의 임의적 접근 : ftell(), fseek(). 입출력문. 입출력 (I/O) 란 입력 (Input) 과 출력 (Output) 을 칭하는 용어 입력 : 외부 입력 장치로부터 데이터를 프로그램으로 읽어들이는 행위 출력 : 프로그램상의 어떤 값을 출력장치로 내보내는 행위. 입출력문 ( 계속 ). 입출력을 위해 프로그램에서 사용하는 문장을 입출력문이라 함

chiara
Download Presentation

입출력문 입력 함수 scanf() 출력 함수 printf() 파일 입출력 파일의 임의적 접근 : ftell(), fseek()

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 제 11 장 입력과 출력 • 입출력문 • 입력 함수 scanf() • 출력 함수 printf() • 파일 입출력 • 파일의 임의적 접근 : ftell(), fseek()

  2. 입출력문 • 입출력(I/O)란 입력(Input)과 출력(Output)을 칭하는 용어 • 입력 : 외부 입력 장치로부터 데이터를 프로그램으로 읽어들이는 행위 • 출력 : 프로그램상의 어떤 값을 출력장치로 내보내는 행위

  3. 입출력문(계속) • 입출력을 위해 프로그램에서 사용하는 문장을 입출력문이라 함 • 프로그래머가 자기 목적에 맞게 입출력 루틴을 수정하여 사용할 수 있음

  4. 입출력문(계속) • 표준 입출력 • 입출력 장치가 미리 정해진 입출력을 의미 • 표준 입력 장치 : 키보드(Keyboard) • 표준 출력 장치 : 화면(Screen) • 표준 입출력 장치는 운영체제에서 재 지정할 수 있음

  5. 입출력문(계속) • 표준 입출력에 사용되는 라이브러리 함수 • 표준 입출력을 사용하는 모든 프로그램은 반드시 표제 파일 stdio.h를 포함해야 함 문자 입출력 --------------- getchar( ), putchar( ) 라인 입출력 ---------------- gets( ), puts( ) 형식화된 입출력 --------- scanf( ), printf( )

  6. 문자 입출력 • 버퍼없이 문자 단위로 입출력을 수행 • 주로 키보드와 같은 문자형 장치에서 사용함 • 입출력 속도가 블록 입출력에 비해 상대적으로 느림 • 입출력 함수 : getchar( ), putchar( )

  7. getchar( ) 함수 • 호출될 때마다 한번에 한 문자씩 읽어 들이며 입력의 끝에 도달했을 때 EOF(End of File)을 복귀 • 형태 int getchar( ) ;

  8. putchar( ) 함수 • 표준 출력 장치로 한번에 한 문자씩 내보내는 함수 • 형태 • putchar( ) 함수가 호출될 때마다 문자 c가 화면에 출력됨 int putchar( c ) ;

  9. putchar( ) 함수(계속) • 한번에 한 문자씩 입력 전체를 그대로 출력해 주는 프로그램 예 • getchar( ), putchar( ) 의 마크로는 함수 getc( )와 putc( )이며 다음과 같이 나타낼 수 있음 #define getchar( ) getc( stdin ) #define putchar(x) putc( x, stdout )

  10. 라인 입출력 • 라인 단위로 입출력을 수행 • 표준 입출력 함수는 gets( )와 puts( )이 있음 • gets( ) : 한 라인의 입력을 읽어 문자 배열에 저장하는 함수 • puts( ) : 임의의 문자열을 표준 출력으로 내 보내는 함수

  11. 라인 입출력(계속) • 형태 char *gets( char *s) ; int puts( char *s) ;

  12. 라인 입출력(계속) • gets( ) • 개행문자(\n)나 EOF를 만날 때까지 일련의 문자열을 읽어 s 가 가리키는 곳에 저장 • 끝에 ‘\0’를 첨가 • 함수의 복귀 값으로 EOF나 에러를 만나면 NULL을, 그렇지 않으면 문자열 s를 이양

  13. 라인 입출력(계속) • puts( ) • s가 가리키는 일련의 문자들과 개행문자를 표준 출력으로 보냄 • 에러가 발생하면 EOF를 그렇지 않으면 0을 복귀함

  14. 형식화된 입출력 • 명시된 형식(Format)에 따라 입출력을 수행하는 것을 말함 • 함수로는 scanf( )와 printf( )가 있음

  15. scanf( ) • 표준 입력으로부터 문자들을 읽어서 형식에서 명시된 대로 변환하여 그 결과를 지정한 입력 변수들에 저장하는 함수 • 형태 scanf( format, …) ;

  16. scanf( )(계속) • 형식은 “와 “ 사이에 표현되며 입력으로부터 읽어들인 자료들을 어떤 형태로 변수에 저장할 것인가를 나타내는 변환 명세(Conversion specification)가 기술됨 • … 기호는 변환 명세에 따라 해석된 값들이 저장되는 변수들의 리스트를 명시

  17. scanf( )(계속) • 변환 명세 • % 기호와 변환 문자(Conversion character)로 구성되며 그 사이에 변환을 제어하는 여러 종류의 문자가 나타남 • 입력을 위한 변환 명세 구조 *는 배정 억제 문자(Assignment suppression character) % * 자릿수 . 자릿수 변환문자

  18. scanf( )(계속) • 입력 변환 문자의 종류 %d : 십진수로 된 정수(decimal) %I : 정수(integer), 십진수, 8진수(0으로 시작), 16진수 %o : 8진수로 된 정수(octal) %x : 16진수로 된 정수(hexadecimal) %u : 부호가 없는 정수(unsigned) %c : 문자(character) %s : 문자열(string) %f, %e : 실수(float)

  19. scanf( )(계속) • 정수 변환 문자 앞에 h자나 l자가 올 수 있는데 각각 short과 long을 의미 • 실수 변환 문자 앞에 l자가 있는 경우 double을 의미

  20. scanf( )(계속) • 변환 명세 예 • %5d : 다섯자리를 읽어 십진수의 정수로 변환 • %10.5f : 10자리를 읽어 소수점 이하가 다섯 자리인 실수로 변환 %5d %10.5f

  21. scanf( )(계속) • scanf( ) 함수의 변수 리스트에 나오는 변수는 반드시 저장하려는 변수의 주소이어야 함

  22. printf( ) 함수 • 표준 출력으로 변수들을 형식에서 명시한 형태로 변환하여 출력하는 형식화된 출력함수 • 형태 printf (format, …) ;

  23. printf( ) 함수 • 출력으로 그대로 복사되는 일반 문자들과 변환 명세로 구성됨 • 변환 명세는 %기호로 시작하여 맨 끝에 변환 문자가 오는 형태로 이루어짐 • 출력 변환 명세 형태 • -는 좌측 정돈(Left adjustment)하여 출력 % - 자릿수 . 자릿수 변환문자

  24. printf( ) 함수(계속) %d : 변수가 십진수 형태로 바뀌어 출력됨 %o : 변수가 부호없는 8진수로 바뀌어 출력됨 %x : 변수가 부호 없는 16진수로 바뀌어 출력됨 %u : 변수가 부호없는 십진수로 바뀌어 출력됨 %p : 변수가 기억 공간 주소를 16진수로 출력함 %c : 변수가 한 개의 문자로 간주되어 출력됨 %s : 변수가 문자열로 간주되어 출력됨 %f : 실수로 간주되어 [-]mmm.nnnn 형태로 변환되어 출력됨 %e : 실수로 간주되어 [-]m.nnnnnnE[+-]xx 형태로 변환되어 출력됨 %g : %e와 %f 중 길이가 짧은 것이 선택되어 출력됨 %% : % 자체를 출력함 • 출력 변환 문자

  25. 파일 입출력 • 파일 입출력: 프로그래머가 프로그램에서 지정한 입출력 파일을 통하여 입력과 출력을 수행함. • _iobuf: 입출력할 주변장치나 파일에 관한 정보. typedef struct _iobuf { int cnt; /* 버퍼 카운터 */ char *ptr; /* 버퍼 포인터 */ char *base; /* 버퍼 위치 */ int flag; /* 파일 접근 모드 */ int fd; /* 파일 디스크립터 */ } FILE; • FILE : _iobuf의 구조를 나타내는 자료형.

  26. 파일 입출력(계속) • 파일 입출력:파일 포인터(file pointer)를 통하여 입출력. FILE *fp; /* fp가 파일 포인터로 선언됨 */

  27. 파일 입출력(계속) • 파일 입출력 함수: 파일 오픈과 클로즈 : fopen(), fclose() fgetc(), fputc(), ungetc() fgets(), fputs() 파일 입출력 입력 및 출력 : fread(), fwrite() fscanf(), fprintf() sscanf(), sprintf() 파일 임의 접근 : fseek(), ftell(), rewind(), fgetpos(), fsetpos() 등 파일 에러 함수 : learerr(), ferror(), perror(), feof() 등

  28. 파일 오픈과 클로즈 • 파일 오픈: 파일 입출력을 수행하기 위해서 프로그램과 파일 사이에 접속을 하는 것. • 함수 fopen(): 지정된 파일을 오픈하여 프로그램과 파일을 연결시키고 파일에 관한 모든 정보를 구조 변수에 저장하며 그 구조 변수를 가리키는 파일 포인터를 복귀하여 지정된 파일에 대한 입출력을 가능하게 해 줌.

  29. 파일 오픈과 클로즈(계속) • fopen()의 함수원형: • name : 입출력할 파일의 이름, • mode : 입출력 모드. 입력-> "r", 출력-> "w", 첨가 -> "a". FILE *fopen(char *name, char *mode);

  30. 파일 오픈과 클로즈(계속) • FILE: 파일에 관한 정보를 가지고 있는 구조형 fp: FILE 구조에 대한 포인터 즉, 파일 포인터 fp = fopen(name, mode);

  31. 파일모드 기 능 "r" 디스크에 있는 파일로부터 입력. 파일이 없으면 에러. "w" 디스크에 있는 파일로 출력. 파일이 없으면 새로 생성하고, 있으면 기존의 파일은 지워짐 "a" 디스크에 있는 파일에 첨가. 파일이 없으면 새로 생성하고, 있으면 기존의 파일 끝에 첨가 "r+" 디스크에 있는 파일을 갱신하기 위해 입 출력 모드로 오픈. 파일이 없으면 에러. "w+" 디스크에 있는 파일을 갱신하기 위해 입 출력 모드로 오픈. 파일이 없으면 새로 생성하고, 있으면 기존의 파일은 지워짐 "a+" 디스크에 있는 파일을 갱신하기 위해 첨가 모드로 오픈. 파일이 없으면 새로 생성하고, 있으면 기존의 파일 끝에 첨가 파일 오픈과 클로즈(계속) • 함수 fopen()의 기능:

  32. 파일 오픈과 클로즈(계속) • 함수 fclose(): 파일 이름과 파일 포인터 사이의 접속 상태를 단절하여 파일을 다른 프로그램에서 사용하게 하거나 파일 포인터를 다른 파일에 대한 포인터로 재사용할 수 있게 해 줌.

  33. 파일 오픈과 클로즈(계속) • 프로그램이 정상적으로 종료된 경우에는 각 오픈된 파일에 대해 함수 fclose()가 자동 호출되어 오픈된 모든 파일을 클로즈 함 • fclose()의 함수원형: fclose(fp); int fclose(FILE *fp);

  34. 파일 입력 및 출력 • 파일 입출력 함수: 입출력 함수 : fgetc(), fputc(), ungetc() 라인 입출력 함수 : fgets(), fputs() 입출력 함수 블록 입출력 함수 : fread(), fwrite() 형식화된 입출력 함수 : fscanf(), fprintf() 스트링 입출력 함수 : sscanf(), sprintf()

  35. 문자 입출력: fgetc(), fputc(), • 함수 fgetc(): 파일로부터 한 문자를 읽어 복귀함. c=fgetc(fp); • 함수 fputc(): 한 문자를 파일 포인터 fp가 지정한 파일에 출력. fputc(c, fp); /* 문자 c를 fp가 지정한 파일에 출력 */ int fgetc(FILE *fp); int fputc(int c, FILE *fp);

  36. 문자 입출력: fgetc(), fputc() (계속) • 표준 입출력 함수의 의미: getchar() <===> fgetc(stdin) putchar(c) <===> fputc(c, stdout)

  37. [프로그램] #include <stdio.h> int main() { FILE *fp1, *fp2; /* 파일 오픈 : 파일 포인터의 선언 */ char c; if ((fp1 = fopen("filea", "r")) == NULL) /* 입력파일의 지정 */ return -1; if ((fp2 = fopen("fileb", "w")) == NULL) /* 출력파일의 지정 */ { fclose(fp1); return -1; } while ((c = fgetc(fp1)) != EOF) /* 파일 복사 */ fputc(c, fp2); fclose(fp1); /* 파일 클로즈 */ fclose(fp2); /* 파일 클로즈 */ return 0; } • /* 함수 fgetc()와 fputc()를 사용한 파일 복사 프로그램 */

  38. [프로그램] • /* 함수 fgetc()와 fputc()를 사용한 문자 변환 프로그램 */ #include <stdio.h> #include <ctype.h> int main() { FILE *fp1, *fp2; /* 파일 오픈 : 파일 포인터의 선언 */ char c; if ((fp1 = fopen("filea", "r")) == NULL) /* 입력파일의 지정 */ return -1; if ((fp2 = fopen("fileb", "w")) == NULL) /* 출력파일의 지정 */ { fclose(fp1); return -1; } while ((c = fgetc(fp1)) != EOF) /* 소문자 -> 대문자 변환 */ { c = islower(c) ? toupper(c) c; fputc(c, fp2); } fclose(fp1); /* 파일 클로즈 */ fclose(fp2); /* 파일 클로즈 */ return 0; }

  39. 라인 입출력: fgets(), fputs() • 함수 fgets() : 파일로부터 한 라인을 읽어 배열에 저장. • s : 읽은 라인을 저장할 배열에 대한 포인터, • n : 읽을 라인의 스트링 길이, • fp : 입력 파일을 가리키는 파일 포인터. • 함수 fgets(): fp가 지정한 파일로부터 한 줄을 읽어 s가 가리키는 배열에 저장하고 라인의 끝에 스트링의 끝을 나타내는 널문자(null character) ''를 자동으로 삽입하며 파일의 끝을 만나면 NULL을 복귀함. fgets(s, n, fp); char *fgets(char *s, int n, FILE *fp);

  40. 라인 입출력: fgets(), fputs()(계속) • 함수 fputs() : 한 라인을 파일 포인터가 가리키는 파일에 출력함. fputs(s, fp); /* s에 저장된 스트링을 fp가 가리키는 파일에 출력 */ int *fputs(char *s, FILE *fp);

  41. [프로그램 ] • /* fgets()와 fputs()를 사용한 파일 복사 프로그램 */ #include <stdio.h> #define LENGTH 80 int main() { FILE *fp1, *fp2;/* 파일 오픈 : 파일 포인터의 선언 */ char line[LENGTH]; if ((fp1 = fopen("source", "r")) == NULL) { fprintf(stderr, "Source does not exist"); /* 입력파일 선언 */ return -1; } fp2 = fopen("target", "w"); /* 출력 파일 선언 */ while (fgets(line, LENGTH-1, fp1)) /* 파일 복사 */ fputs(line, fp2); fclose(fp1); /* 파일 클로즈 */ fclose(fp2); /* 파일 클로즈 */ }

  42. 블록 입출력: fread(), fwrite() • 함수 fread() : 파일 포인터 fp가 가리키는 파일로 부터 블록 단위로 데이타를 입력하여 지정된 곳에 저장함. • 함수 fread()의 함수 원형: size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);

  43. 블록 입출력: fread(), fwrite()(계속) • 함수 fread() : 파일 포인터 fp가 지정한 파일로 부터 size 만큼의 바이트 크기를 갖는 객체를 nobj의 갯수만큼 읽어서 ptr가 가리키는 곳에 저장함. • 즉, ptr가 가리키는 곳에 size*nobj 바이트 만큼 읽어 들여 저장을 함. fread(s, sizeof(*s), 100, fp);

  44. 블록 입출력: fread(), fwrite()(계속) • 함수 fwrite() : ptr가 가리키는 곳에서 블록의 크기(size*nobj 바이트)만큼 파일 포인터 fp가 가리키는 파일에 출력함. • 함수 fwrite()의 함수 원형: size : 객체의 크기(바이트 단위), nobj :객체의 개수. size_t fwrite(void *ptr, size_t size, size_t nobj, FILE *fp);

  45. [프로그램] • /* 함수 fread()와 fwrite()를 사용한 파일 복사 프로그램 */ #include <stdio.h> #define B_SIZE 512 int main() { FILE *fp1, *fp2; /* 파일 오픈 : 파일 포인터의 선언 */ char block[B_SIZE]; int nobj; if ((fp1 = fopen("source", "r")) == NULL) { fprintf(stderr, "Source does not exist"); return -1; } fp2 = fopen("target", "w"); do { /* 파일 복사 */ nobj = fread(block,sizeof(char),B_SIZE,fp1)); fwrite(block, sizeof(char), nobj, fp2); }while (nobj == B_SIZE); fclose(fp1); /* 파일 클로즈 */ fclose(fp2); /* 파일 클로즈 */ }

  46. 형식화된 입출력: fscanf(), fprintf() • 형식화된 입출력 함수 : 형식을 지정하여 파일 입출력을 수행하는 함수. • fscanf(), fprintf() 함수 원형: int fscanf(FILE *fp, char *fmt, ...); int fprintf(FILE *fp, char *fmt, ...);

  47. 형식화된 입출력: fscanf(), fprintf()(계속) 입력 파일 : data 95 78 85 86 94 78 76 68 88 출력 파일 : result --------------------- Score Table ---------------------- FORTRAN COBOL C TOTAL AVERAGE ------------------------------------------------------------ 95 78 85 258 86.00 86 92 78 256 85.33 76 68 88 232 77.33

  48. [프로그램] #include <stdio.h> int main() { FILE *fp1, *fp2; int fortran, cobol, c; int total; float ave; if ((fp1 = fopen("data", "r")) == NULL) { fprintf(stderr, "Data file does not exist"); return -1; } fp2 = fopen("result", "w"); fprintf(fp2, " --------------- Score Table --------------- "); fprintf(fp2, " FORTRAN COBOL C TOTAL AVERAGE"); fprintf(fp2, " ------------------------------------------------"); while (fscanf(fp1,"%d %d %d",&fortran,&cobol,&c) != EOF) { total = fortran + cobol + c; ave = total / 3; fprintf(fp2,"%5d %7d %4d %5d %8.2f", fortran, cobol, c, total, ave); } fclose(fp1); /* 파일 클로즈 */ fclose(fp2); /* 파일 클로즈 */ } • /* 함수 fscanf()와 fprintf()를 사용한 성적처리 프로그램 */

  49. 스트링 입출력: sscanf(), sprintf() • 스트링 입출력:파일 대신에 스트링을 사용하여 입력과 출력을 수행하는 것. • 스트링 입출력은 입출력 데이타를 임시로 주기억장치에 저장하였다 후에 다시 사용하는 방법으로 파일 입출력보다 수행시간이 빠름. • 스트링에 입출력하는 것을 제외하면 scanf(), printf()와 형태와 기능이 같음. • 함수 sscanf(), sprintf()의 함수 원형: sscanf(char *s, const char *format, ...); sprintf(char *s, const char *format, ...);

  50. [프로그램] • /* sprintf()를 사용한 출력 프로그램 */ #include <stdio.h> void main() { char buffer[100]; char s[] = "Computer Engineering"; char c = '%'; int i = 32767; float f = 0.123456789; int j; j = sprintf(buffer, "\f2 tString: %s", s); j += sprintf(buffer+j, "\f2 tCharacter: %c", c); j += sprintf(buffer+j, "\f2 tInteger: %d", i); j += sprintf(buffer+j, "\f2 tReal: %f", f); printf("Output:%s\f2 nCharacter count = %d", buffer,j); } 출력 결과 String: Computer Engineering Character: % Integer: 32767 Real: 0.123456 Character count = 86

More Related