입출력문 입력 함수 scanf() 출력 함수 printf() 파일 입출력 파일의 임의적...

65
1 입입입입 입입 입입 scanf() 입입 입입 printf() 입입 입입입 입입입 입입입 입입 : ftell(), fseek() 입 11 입 입입입 입입

Upload: chiara

Post on 14-Jan-2016

106 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

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

1

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

제 11 장 입력과 출력

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

2

입출력문

• 입출력 (I/O) 란 입력 (Input) 과 출력 (Output) 을 칭하는 용어

• 입력 : 외부 입력 장치로부터 데이터를 프로그램으로 읽어들이는 행위

• 출력 : 프로그램상의 어떤 값을 출력장치로 내보내는 행위

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

3

입출력문 ( 계속 )

• 입출력을 위해 프로그램에서 사용하는 문장을 입출력문이라 함

• 프로그래머가 자기 목적에 맞게 입출력 루틴을 수정하여 사용할 수 있음

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

4

입출력문 ( 계속 )

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

있음

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

5

입출력문 ( 계속 )

• 표준 입출력에 사용되는 라이브러리 함수

• 표준 입출력을 사용하는 모든 프로그램은 반드시 표제 파일 stdio.h 를 포함해야 함

문자 입출력 --------------- getchar( ), putchar( )라인 입출력 ---------------- gets( ), puts( )형식화된 입출력 --------- scanf( ), printf( )

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

6

문자 입출력• 버퍼없이 문자 단위로 입출력을 수행• 주로 키보드와 같은 문자형 장치에서

사용함• 입출력 속도가 블록 입출력에 비해

상대적으로 느림• 입출력 함수 : getchar( ), putchar( )

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

7

getchar( ) 함수

• 호출될 때마다 한번에 한 문자씩 읽어 들이며 입력의 끝에 도달했을 때 EOF(End of File) 을 복귀

• 형태

int getchar( ) ;

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

8

putchar( ) 함수

• 표준 출력 장치로 한번에 한 문자씩 내보내는 함수

• 형태

• putchar( ) 함수가 호출될 때마다 문자 c가 화면에 출력됨

int putchar( c ) ;

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

9

putchar( ) 함수 ( 계속 )

• 한번에 한 문자씩 입력 전체를 그대로 출력해 주는 프로그램 예

• getchar( ), putchar( ) 의 마크로는 함수 getc( ) 와 putc( ) 이며 다음과 같이 나타낼 수 있음

#define getchar( ) getc( stdin )#define putchar(x) putc( x, stdout )

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

10

라인 입출력

• 라인 단위로 입출력을 수행• 표준 입출력 함수는 gets( ) 와 puts( ) 이 있음• gets( ) : 한 라인의 입력을 읽어 문자 배열에

저장하는 함수• puts( ) : 임의의 문자열을 표준 출력으로 내

보내는 함수

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

11

라인 입출력 ( 계속 )

• 형태

char *gets( char *s) ;int puts( char *s) ;

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

12

라인 입출력 ( 계속 )

• gets( ) – 개행문자 (\n) 나 EOF 를 만날 때까지

일련의 문자열을 읽어 s 가 가리키는 곳에 저장

– 끝에 ‘ \0’ 를 첨가– 함수의 복귀 값으로 EOF 나 에러를 만나면

NULL 을 , 그렇지 않으면 문자열 s 를 이양

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

13

라인 입출력 ( 계속 )

• puts( )– s 가 가리키는 일련의 문자들과 개행문자를

표준 출력으로 보냄– 에러가 발생하면 EOF 를 그렇지 않으면 0

을 복귀함

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

14

형식화된 입출력• 명시된 형식 (Format) 에 따라 입출력을

수행하는 것을 말함• 함수로는 scanf( ) 와 printf( ) 가 있음

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

15

scanf( )

• 표준 입력으로부터 문자들을 읽어서 형식에서 명시된 대로 변환하여 그 결과를 지정한 입력 변수들에 저장하는 함수

• 형태

scanf( format, …) ;

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

16

scanf( )( 계속 )

• 형식은 “와 “ 사이에 표현되며 입력으로부터 읽어들인 자료들을 어떤 형태로 변수에 저장할 것인가를 나타내는 변환 명세 (Conversion specification) 가 기술됨

• … 기호는 변환 명세에 따라 해석된 값들이 저장되는 변수들의 리스트를 명시

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

17

scanf( )( 계속 )

• 변환 명세– % 기호와 변환 문자 (Conversion character) 로

구성되며 그 사이에 변환을 제어하는 여러 종류의 문자가 나타남

– 입력을 위한 변환 명세 구조

* 는 배정 억제 문자 (Assignment suppression character)

% * 자릿수 . 자릿수 변환문자

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

18

scanf( )( 계속 )

• 입력 변환 문자의 종류

%d : 십진수로 된 정수 (decimal)%I : 정수 (integer), 십진수 , 8 진수 (0 으로 시작 ), 16 진수%o : 8 진수로 된 정수 (octal)%x : 16 진수로 된 정수 (hexadecimal) %u : 부호가 없는 정수 (unsigned)%c : 문자 (character)%s : 문자열 (string)%f, %e : 실수 (float)

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

19

scanf( )( 계속 )

• 정수 변환 문자 앞에 h 자나 l 자가 올 수 있는데 각각 short 과 long 을 의미

• 실수 변환 문자 앞에 l 자가 있는 경우 double 을 의미

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

20

scanf( )( 계속 )

• 변환 명세 예

• %5d : 다섯자리를 읽어 십진수의 정수로 변환

• %10.5f : 10 자리를 읽어 소수점 이하가 다섯 자리인 실수로 변환

%5d%10.5f

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

21

scanf( )( 계속 )

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

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

22

printf( ) 함수

• 표준 출력으로 변수들을 형식에서 명시한 형태로 변환하여 출력하는 형식화된 출력함수

• 형태

printf (format, …) ;

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

23

printf( ) 함수

• 출력으로 그대로 복사되는 일반 문자들과 변환 명세로 구성됨

• 변환 명세는 % 기호로 시작하여 맨 끝에 변환 문자가 오는 형태로 이루어짐

• 출력 변환 명세 형태

– - 는 좌측 정돈 (Left adjustment) 하여 출력

% - 자릿수 . 자릿수 변환문자

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

24

printf( ) 함수 ( 계속 )

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

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

25

파일 입출력

• 파일 입출력 : 프로그래머가 프로그램에서 지정한 입출력 파일을 통하여 입력과 출력을 수행함 .

• _iobuf: 입출력할 주변장치나 파일에 관한 정보 . typedef struct _iobuf { int cnt; /* 버퍼 카운터 */ char *ptr; /* 버퍼 포인터 */ char *base; /* 버퍼 위치 */ int flag; /* 파일 접근 모드 */ int fd; /* 파일 디스크립터 */ } FILE;

– FILE : _iobuf 의 구조를 나타내는 자료형 .

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

26

파일 입출력 ( 계속 )

• 파일 입출력 :

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

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

27

파일 입출력 ( 계속 )

• 파일 입출력 함수 :

파일 오픈과 클로즈 : fopen(), fclose()

fgetc(), fputc(), ungetc() fgets(), fputs() 파일 입출력 입력 및 출력 : fread(), fwrite() fscanf(), fprintf() sscanf(), sprintf()

파일 임의 접근 : fseek(), ftell(), rewind(), fgetpos(), fsetpos() 등

파일 에러 함수 : learerr(), ferror(), perror(), feof() 등

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

28

파일 오픈과 클로즈

• 파일 오픈 : 파일 입출력을 수행하기 위해서 프로그램과 파일 사이에 접속을 하는 것 .

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

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

29

파일 오픈과 클로즈 ( 계속 )

• fopen() 의 함수원형 :

– name : 입출력할 파일의 이름 ,– mode : 입출력 모드 . 입력 -> "r", 출력 -> "w", 첨가 -> "a".

FILE *fopen(char *name, char *mode);

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

30

파일 오픈과 클로즈 ( 계속 )

• FILE: 파일에 관한 정보를 가지고 있는 구조형

fp: FILE 구조에 대한 포인터 즉 , 파일 포인터

fp = fopen(name, mode);

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

31

파일 오픈과 클로즈 ( 계속 )

• 함수 fopen() 의 기능 :파일모드

디스크에 있는 파일로부터 입력 .파일이 없으면 에러 ."r"

"r+"

"w+"

"a+"

"w"

"a"

디스크에 있는 파일로 출력 .파일이 없으면 새로 생성하고 , 있으면 기존의 파일은 지워짐디스크에 있는 파일에 첨가 .파일이 없으면 새로 생성하고 , 있으면 기존의 파일 끝에 첨가디스크에 있는 파일을 갱신하기 위해 입 출력 모드로 오픈 .파일이 없으면 에러 .

디스크에 있는 파일을 갱신하기 위해 입 출력 모드로 오픈 .파일이 없으면 새로 생성하고 , 있으면 기존의 파일은 지워짐디스크에 있는 파일을 갱신하기 위해 첨가 모드로 오픈 .파일이 없으면 새로 생성하고 , 있으면 기존의 파일 끝에 첨가

기 능

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

32

파일 오픈과 클로즈 ( 계속 )

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

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

33

파일 오픈과 클로즈 ( 계속 )

• 프 로 그 램 이 정 상 적 으 로 종 료 된 경우에는 각 오픈된 파일에 대해 함수 fclose() 가 자동 호출되어 오픈된 모든 파일을 클로즈 함

• fclose() 의 함수원형 :

fclose(fp);int fclose(FILE *fp);

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

34

파일 입력 및 출력• 파일 입출력 함수 :

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

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

35

문자 입출력 : fgetc(), fputc(),

• 함수 fgetc(): 파일로부터 한 문자를 읽어 복귀함 .

c=fgetc(fp);• 함수 fputc(): 한 문자를 파일 포인터 fp 가

지정한 파일에 출력 .

fputc(c, fp); /* 문자 c 를 fp 가 지정한 파일에 출력 */

int fgetc(FILE *fp);

int fputc(int c, FILE *fp);

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

36

문자 입출력 : fgetc(), fputc() ( 계속 )

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

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

37

[ 프로그램 ]• /* 함수 fgetc() 와 fputc() 를 사용한 파일 복사 프로그램 */

#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; }

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

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; }

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

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);

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

40

라인 입출력 : fgets(), fputs()( 계속 )

• 함수 fputs() : 한 라인을 파일 포인터가 가리키는 파일에 출력함 .

fputs(s, fp); /* s 에 저장된 스트링을 fp 가 가리키는 파일에 출력 *

/

int *fputs(char *s, FILE *fp);

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

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); /* 파일 클로즈 */ }

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

42

블록 입출력 : fread(), fwrite()

• 함 수 fread() : 파 일 포 인 터 fp 가 가리키는 파일로 부터 블록 단위로 데이타를 입력하여 지정된 곳에 저장함 .

• 함수 fread() 의 함수 원형 :

size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);

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

43

블록 입출력 : fread(), fwrite()( 계속 )

• 함 수 fread() : 파일 포인터 fp 가 지정한 파일로 부터 size 만큼의 바이트 크기를 갖는 객체를 nobj 의 갯수만큼 읽어서 ptr 가 가리키는 곳에 저장함 .

• 즉 , ptr 가 가리키는 곳에 size*nobj 바이트 만큼 읽어 들여 저장을 함 .

fread(s, sizeof(*s), 100, fp);

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

44

블록 입출력 : fread(), fwrite()( 계속 )

• 함 수 fwrite() : ptr 가 가리키는 곳에서 블록의 크기 (size*nobj 바이트 ) 만큼 파일 포인터 fp가 가리키는 파일에 출력함.

• 함수 fwrite() 의 함수 원형 :

size : 객체의 크기 ( 바이트 단위 ), nobj : 객체의 개수.

size_t fwrite(void *ptr, size_t size, size_t nobj, FILE *fp);

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

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); /* 파일 클로즈 */

}

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

46

형식화된 입출력 : fscanf(), fprintf()

• 형식화된 입출력 함수 : 형식을 지정하여 파 일 입 출 력 을 수 행 하 는 함 수 .

• fscanf(), fprintf() 함수 원형 :

int fscanf(FILE *fp, char *fmt, ...); int fprintf(FILE *fp, char *fmt, ...);

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

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

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

48

[ 프로그램 ]• /* 함수 fscanf() 와 fprintf() 를 사용한 성적처리 프로그램 */

#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); /* 파일 클로즈 */

}

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

49

스트링 입출력 : sscanf(), sprintf()• 스 트 링 입 출 력 : 파 일 대신에 스 트 링 을

사용하여 입력과 출력을 수행하는 것 .– 스 트 링 입 출 력 은 입 출 력 데 이 타 를 임 시 로

주기억장치에 저장하였다 후에 다시 사용하는 방법으로 파일 입출력보다 수행시간이 빠름 .

– 스트링에 입출력하는 것을 제외하면 scanf(), printf() 와 형 태 와 기 능 이 같 음 .

• 함수 sscanf(), sprintf() 의 함수 원형 :

sscanf(char *s, const char *format, ...);sprintf(char *s, const char *format, ...);

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

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

출력 결과

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

51

파일 임의 접근 : fseek()

• 순차 파일 입출력 (sequential file i/o):– 파일 입출력을 수행할 때 오픈된 파일의 처음

위치 부터 입출력 자료를 차례로 읽거나 쓰는 방법– 파일의 입출력이 차례대로 수행 : 사용이 용이 ,– 파일에 있는 임의의 자료 검색 : 시간이 많이 걸림 .

• 임의 파일 입출력 (random file i/o):– 자료를 차례대로 저장하지 않고 임의의 위치에

저장하고 검색하는 방법 .• 파일내에서 입출력 위치를 옮길 때 사용하는

함수 : fseek(), ftell(), rewind(), fgetpos(), fsetpos() 등

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

52

파일 임의 접근 : fseek() ( 계속 )

• fseek()– 함수 fseek(): 입출력 위치를 파일내의

지정된 곳으로 옮기는 함수 .

offset : origin 으로 부터의 거리 ( 바이트 수 ), origin : 위치를 이동하기 위한 offset 의 기준 . 올바로 수행 : 0 를 복귀 , 그렇지 않으면 음이 아닌 정수값을 복귀 .

int fseek(FILE *fp, long offset, int origin);

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

53

파일 임의 접근 : fseek() ( 계속 )

• 파일내에서 위치를 옮기기 위해 기준이 되는 곳 :

#define SEEK_SET 0 /* 파일의 처음 위치 */#define SEEK_CUR 1 /* 파일의 현재 위치 */#define SEEK_END 2 /* 파일의 끝 위치 */

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

54

파일 임의 접근 : fseek()( 계속 )

• fseek(fp, 10L, SEEK_SET); /* 처음 위치에서 우측으로 10 바이트 이동 */

• fseek(fp, 10L, SEEK_CUR); /* 현재 위치에서 우측으로 10 바이트 이동 */

• fseek(fp, -10L, SEEK_END); /* 끝 위치에서 10 바이트 좌측으로 이동 */

• 함수 fseek() 의 매개변수 offset 의 값은 반드시 long 형– 기준점이 SEEK_SET : offset >= 0,– 기준점이 SEEK_END : offset <= 0,

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

55

[ 프로그램 ]• /* fseek() 를 사용하여 파일에서 한 줄을 읽는 프로그램 */

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

56

[ 프로그램 ]• /* fseek() 를 사용한 입력 프로그램 */

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

57

파일 임의 접근 : fseek() ( 계속 )

• ftell()– 함수 ftell(): 파일의 현재 입출력 위치를

전달하는 함수– 함수 ftell() 의 함수원형 :

– 현재의 파일 위치를 저장하여 두었다가 나중에 그 위치로 다시 되돌아 갈 때 사용함 .

long ftell(FILE *fp);

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

58

파일 임의 접근 : fseek() ( 계속 )

– 함수 ftell() 은 한번 이상 입출력 연산을 수 행 한 후에 지 정 된 파 일 위 치 로 되돌아가는 데 사용됨 .•편집기 : 특정한 문자열 검색할 때 검색이

실패하면 커서는 검색을 시작하기 전의 위치로 복귀 .

cur_pos = ftell(fp); /* 파일 포인터의 현재위치 저장 */ if (search(pattern) == FAIL) fseek(fp, cur_pos, SEEK_SET); /* fp 를 cur_pos 로

이동 */

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

59

[ 프로그램 ]• /* ftell() 를 이용한 파일 위치 출력 프로그램 */

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

60

파일 임의 접근 : fseek() ( 계속 )

• rewind()– 함수 rewind(): 파일 포인터를 파일의 처음

위치로 옮김– 함수 rewind() 의 함수원형 :

rewind(fp); <===> fseek(fp, 0L, SEEK_SET);

void rewind(FILE *fp);

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

61

[ 프로그램 ]• /* rewind() 를 이용한 출력 프로그램 */

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

62

파일 임의 접근 : fseek() ( 계속 )

• fgetpos()– 함 수 fgetpos(): 파 일 포 인 터 의 현재

입출력 위치를 다음에 다시 사용하기 위해 지정된 변수에 저장 .

– 함수 fgetpos() 의 함수원형 :

ptr : 입출력 위치를 저장할 포인터 변수 .

int fgetpos(FILE *fp, fpos_t *ptr);

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

63

파일 임의 접근 : fseek() ( 계속 )

– 함수 fsetpos() : 파일 포인터를 함수 fgetpos() 에 의해저장된 파일의 입출력 위치로 다시 옮기는데 사용 .

– 함수 fsetpos() 의 함수원형 :

ptr : 파일 포인터가 위치할 파일의 입출력 위치

int fsetpos(FILE *fp, fpos_t *ptr);

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

64

파일 임의 접근 : fseek() ( 계속 )

• 편집기 : 문자열 검색 .

fgetpos(fp, ptr); /* 파일 포인터의 위치를 ptr 에 저장 */ if (search(pattern) == FAIL) fsetpos(fp, ptr); /* ptr 에 저장된 위치로 파일 포인터를 이동 */

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

65

파일 에러 처리 함수• 파일 에러 처리 함수 :

• 파일 에러 처리 함수의 기능 :– ferror() : 파일에 에러가 발생했는지를 검사 .– clearerr() : 에러를 처리한 후 정상적인 입출력이 수행되게 함 .– feof() : 파일의 끝인가를 검사 . EOF 이면 0 이 아닌 정수를 복귀 .– perror() : 에러 메시지를 출력하는데 사용 .