Presentation is loading. Please wait.

Presentation is loading. Please wait.

C언어 프로그래밍의 이해 Ch14. 파일 입출력.

Similar presentations


Presentation on theme: "C언어 프로그래밍의 이해 Ch14. 파일 입출력."— Presentation transcript:

1 C언어 프로그래밍의 이해 Ch14. 파일 입출력

2 목차 14.1 입출력 14.2 스트림과 파일 14.3 파일 시스템의 개요 14.4 fread()와 fwrite()
Ch14. 파일 입출력 목차 14.1 입출력 14.2 스트림과 파일 14.3 파일 시스템의 개요 14.4 fread()와 fwrite() 14.5 fseek()와 랜덤 액세스 입출력 14.6 fprintf()와 fscanf() 14.7 표준 스트림 2

3 Ch14. 파일 입출력 14.1 입출력 C 언어는 어떤 입출력 문장도 포함하지 않는 대신에, 모든 입출력 동작들은 C 표준 라이브러리의 함수들을 통해서 수행 C의 입출력 시스템은 자료들을 자신의 내부 2진 표현으로 또는 인간이 읽을 수 있는 텍스트 포맷으로 전달될 수 있도록 함 3

4 14.2 스트림과 파일 C 입출력 시스템은 프로그래머와 실제 장치간의 어떤 수준의 추상화 제공
Ch14. 파일 입출력 14.2 스트림과 파일 C 입출력 시스템은 프로그래머와 실제 장치간의 어떤 수준의 추상화 제공 추상화를 스트림(stream)이라고 하며, 실제 메모리 저장장치를 파일(file)이라고 한다 스트림 C 파일 시스템은 터미널, 디스크 드라이버, 및 테입 드라이버 등을 포함한 다양한 장치들과 동작하도록 설계 스트림들은 매우 독립된 장치이기 때문에, 디스크 파일에 출력하는 함수는 콘솔 같은 다른 종류의 장치에 출력하는 데도 동시에 사용될 수 있음 스트림에는 텍스트(text)와 2진(binery) 스트림 두 가지 유형이 있음 4

5 14.2 스트림과 파일 스트림 텍스트 스트림 텍스트 스트림(text stream)은 문자들의 시퀀스
Ch14. 파일 입출력 14.2 스트림과 파일 스트림 텍스트 스트림 텍스트 스트림(text stream)은 문자들의 시퀀스 변환이 가능하기 때문에, 출력(또는 입력)되는 문자들은 외부 장치의 문자들과 같지 않을 수도 있음 2진 스트림 외부 장치의 바이트들과 일대일로 대응되는 바이트들의 시퀀스 어떠한 문자 변환도 일어나지 않으며, 출력(또는 입력)되는 바이트들의 수는 외부 장치에서의 수와 같음 5

6 14.2 스트림과 파일 파일 C에서, 파일(file)은 디스크 파일에서 터미널 또는 프린터에 이르기까지 어떤 것도 될 수 있음
Ch14. 파일 입출력 14.2 스트림과 파일 파일 C에서, 파일(file)은 디스크 파일에서 터미널 또는 프린터에 이르기까지 어떤 것도 될 수 있음 열기(open) 연산 특정 스트림과 파일을 연관 시킴 일반 파일이 열리면, 정보는 이것과 사용자의 프로그램 사이에서 교환 가능 닫기 연산 파일과 특정 스트림의 관계를 끊는 연산 출력하려고 열었던 파일을 닫으면, 이것과 연관된 스트림의 내용이 외부 장치로 출력 (스트림을 플러슁(flushmg)) 6

7 14.2 스트림과 파일 파일 파일과 연관된 각 스트림은 FILE형의 파일 제어구조를 가지며, 구조는 헤더 STDIO.H에 정의
Ch14. 파일 입출력 14.2 스트림과 파일 파일 파일과 연관된 각 스트림은 FILE형의 파일 제어구조를 가지며, 구조는 헤더 STDIO.H에 정의 C에서, 모든 입출력 연산들을 수행하기 위해서 스트림만을 생각하고 단지 하나의 파일 시스템만을 사용하면 되는 것 C 입출력 시스템은 각 장치로부터의 입력 또는 출력을 쉽게 관리하는 스트림으로 자동 변환 7

8 Ch14. 파일 입출력 14.3 파일 시스템의 개요 ANSI C 파일 시스템은 여러 가지 상호 연관된 함수들로 구성 8

9 14.3 파일 시스템의 개요 파일 포인터 파일 포인터는 ANSI C 입출력 시스템에서 공통적인 도구
Ch14. 파일 입출력 14.3 파일 시스템의 개요 파일 포인터 파일 포인터는 ANSI C 입출력 시스템에서 공통적인 도구 파일 포인터는 특정 파일의 이름, 상태, 및 현재 위치 등을 포함하는 특정 파일에 대한 여러 가지를 정의하는 정보에 대한 포인터 파일 포인터는 특정한 디스크 파일을 식별하고 입출력 함수들의 연산과 직접 연관된 스트림에 의해서 사용 파일 포인터는 FILE형의 포인터 변수 파일들을 읽거나 쓰기 위해서, 프로그램에서 파일 포인터를 사용 FILE *fp; 9

10 14.3 파일 시스템의 개요 파일 열기 fopen() 함수 fopen() 함수의 원형
Ch14. 파일 입출력 14.3 파일 시스템의 개요 파일 열기 fopen() 함수 파일을 사용하고 특정 스트림과 파일을 연결하기 위해서 스트림을 열고, 파일과 연관된 파일 포인터를 리턴 대부분의 경우에 파일은 디스크 파일 의미 fopen() 함수의 원형 filename은 올바른 파일 이름을 구성하는 문자열에 대한 포인터이며, 이것은 경로 정보도 포함 mode가 지적하고 있는 문자열은 특정 파일을 어떻게 열지를 결정 fopen() 함수는 파일 포인터를 리턴, 사용자 프로그램에서는 이 포인터의 값을 절대로 수정할 수 없음 만일 파일을 열 때 오류가 발생하면, fopen()은 널(null) 포인터를 리턴 파일은 텍스트 또는 2진 모드로 열 수 있음 FILE *fopen(const char *filename, const char *mode); 10

11 Ch14. 파일 입출력 14.3 파일 시스템의 개요 파일 열기 모드 값 11

12 14.3 파일 시스템의 개요 파일 열기 다음 코드는 출력을 위해서 TEST라는 파일을 열기 위해서 fopen()을 사용
Ch14. 파일 입출력 14.3 파일 시스템의 개요 파일 열기 다음 코드는 출력을 위해서 TEST라는 파일을 열기 위해서 fopen()을 사용 프로그램에서 파일을 열기 전에 파일의 오류체크, fopen()의 성공여부 확인 FILE *fp; fp = fopen("test", "w"); FILE *fp; if((fp = fopen("test","w")) == NULL) { printf("Cannot open file.\n"); exit(1); } 12

13 14.3 파일 시스템의 개요 파일 닫기 fclose() 함수 fclose() 함수의 원형 fopen()으로 열린 스트림을 닫음
Ch14. 파일 입출력 14.3 파일 시스템의 개요 파일 닫기 fclose() 함수 fopen()으로 열린 스트림을 닫음 아직 디스크 버퍼에 남아 있는 자료를 해당 파일에 쓰고, 그 파일에 대한 정상적인 운영체제 수준의 닫기를 수행 fclose()는 또한 스트림과 관련된 파일 제어 블록을 반환하여 다시 사용할 수 있도록 함 fclose() 함수의 원형 fp는 fopen()시에 리턴했던 파일 포인터 리턴값 0은 성공적으로 닫았음을 나타냄 오류가 발생하면, 이 함수는 EOF를 리턴 int fclose(FILE *fp); 13

14 14.3 파일 시스템의 개요 문자 쓰기 putc()와 fputc() 함수 함수의 원형
Ch14. 파일 입출력 14.3 파일 시스템의 개요 문자 쓰기 putc()와 fputc() 함수 이전의 C 버전들과의 일관성을 유지하기 위해서 모두 사용 putc() 함수는 이전에 fopen() 함수에 의해서 열린 파일에 문자를 사용 함수의 원형 fp는 fopen()에 의해서 리턴된 파일 포인터 ch는 출력할 문자, ch는 int로 정의되며, 단지 하위 바이트만을 사용 putc() 연산이 성공하면, 출력할 문자를 리턴하고, 그렇지 않으면 EOF를 리턴 int putc(int ch, FILE *fp); 14

15 14.3 파일 시스템의 개요 문자 읽기 getc()와 fgetc() 함수 getc()의 원형 텍스트 파일을 읽기
Ch14. 파일 입출력 14.3 파일 시스템의 개요 문자 읽기 getc()와 fgetc() 함수 getc() 함수는 이전에 fopen()에서 읽기 모드로 열린 파일로부터 문자들을 읽음 getc()의 원형 fp는 fopen()에서 리턴된 FILE형의 파일 포인터 getc()는 int형을 리턴하며, 상위 바이트는 0 getc() 함수는 파일의 끝에 도달하면 EOF를 리턴 오류가 발생해도 EOF를 리턴. 이때 어떤 오류가 발생했는지를 정확하게 결정하기 위해서 ferror() 사용 텍스트 파일을 읽기 int getc(FILE *fp); do { ch = getc(fp); } while(ch!=EOF); 15

16 14.3 파일 시스템의 개요 따라하기1(프로그램명: KTOD) Ch14. 파일 입출력
//파일을 생성하는 프로그램 #include <stdio.h> #include <stdlib.h> void main(int argc, char *argv[]) { FILE *fp; char ch; if(argc!=2) { printf("You forgot to enter the filename.\n"); exit(1); } if((fp=fopen(argv[1], "w"))==NULL) { printf("Cannot open file.\n"); 16

17 14.3 파일 시스템의 개요 따라하기1(프로그램명: KTOD) Ch14. 파일 입출력 do { ch = getchar();
putc(ch, fp); } while(ch!='$'); fclose(fp); } KTOD test test 파일 17

18 14.3 파일 시스템의 개요 따라하기2(프로그램명: DTOS) Ch14. 파일 입출력
// 어떤 ASCII파일을 읽고, 그 내용을 화면에 출력하는 프로그램 #include <stdio.h> #include <stdlib.h> void main(int argc, char *argv[]) { FILE *fp; char ch; if(argc!=2) { printf("You forgot to enter the filename.\n"); exit(1); } if((fp=fopen(argv[1], "r"))==NULL) { printf("Cannot open file.\n"); ch = getc(fp); /* 한 문자 읽기 */ 18

19 14.3 파일 시스템의 개요 따라하기2(프로그램명: DTOS) Ch14. 파일 입출력 while(ch!=EOF) {
putchar(ch); /* 화면에 출력 */ ch = getc(fp); } fclose(fp); printf("\n"); DTOS test 19

20 14.3 파일 시스템의 개요 fputs()와 fgets()로 문자열 작업하기
Ch14. 파일 입출력 14.3 파일 시스템의 개요 fputs()와 fgets()로 문자열 작업하기 getc()와 putc()와 더불어, C는 디스크 파일에 문자열을 읽고 쓰는 fgets()와 fputs() 함수를 제공 이 함수들은 putc()와 getc()처럼 동작하지만, 하나의 문자를 읽거나 쓰는 것이 아니라, 문자열을 읽거나 쓴다 함수 원형 fputs()와 fgets()의 원형은 STDIO.H int fputs(const char *str, FILE *fp); char *fgets(char *str, int length, FILE *fp); 20

21 14.3 파일 시스템의 개요 fputs()와 fgets()로 문자열 작업하기 fputs() 함수 fgets() 함수
Ch14. 파일 입출력 14.3 파일 시스템의 개요 fputs()와 fgets()로 문자열 작업하기 fputs() 함수 str이 지적하고 있는 문자열을 지정된 스트림에 쓰며, 오류가 발생하면, EOF을 리턴 fgets() 함수 뉴라인 문자를 읽거나 또는 length-1 개의 문자를 읽을 때까지 지정된 스트림으로부터 문자열을 읽음 뉴라인이 읽혀지면, 이것은 (gets() 함수와는 달리) 문자열의 일부가 됨 만일 호출이 성공하면 str을 리턴하며 오류가 발생하면 널(null) 포인터를 리턴 21

22 Ch14. 파일 입출력 14.3 파일 시스템의 개요 따라하기4 //fputs()예제, 키보드에서 문자열을 읽어 이들을 Test 파일에 쓴다. 프로그램을 종료하기 위해 빈 라인 입력 #include <stdio.h> #include <stdlib.h> #include <string.h> void main(void) { char str[80]; FILE *fp; if((fp = fopen("TEST.txt", "w"))==NULL) { printf("Cannot open file.\n"); exit(1); } do { printf("Enter a string (CR to quit):\n"); gets(str); strcat(str, "\n"); /* 뉴라인 추가 */ fputs(str, fp); } while(*str!='\n'); I love Jerry~!! Enter \0 Enter 22

23 14.3 파일 시스템의 개요 스트림 비우기(flushing)
Ch14. 파일 입출력 14.3 파일 시스템의 개요 스트림 비우기(flushing) 출력 스트림의 내용을 비우고자 할 때, fflush() 함수를 사용 함수 원형 fflush() 함수는 어떤 버퍼 자료의 내용을 fp와 연관된 파일에 쓴다 만일 fp를 널(null)로 하여 fflush()를 호출하면, 출력을 위해서 열린 모든 파일들은 비워짐 fflush() 함수의 호출이 성공하면 0을 리턴하고, 그렇지 않으면, EOF을 리턴 int fflush(FILE *fp); 23

24 Ch14. 파일 입출력 14.4 fread()와 fwrite 한 바이트보다 긴 자료형을 읽고 쓰기 위해서, ANSI C 파일 시스템은 fread()와 fwrite() 함수를 제공 ANSI C 입출력 시스템에서는 파일 위치 지시자를 설정하는 fseek()를 이용하여 어느 곳에서나 읽고 쓸 수 있도록 함 ANSI C 입출력 시스템은 fprintf()와 fscanf()를 포함 이 함수들은 파일에서 동작한다는 것만 제외하고는 printf()와 scanf()와 매우 유사 속도나 또는 파일 크기가 중요한 분야에서는 fread()와 fwrite()를 사용하는 것이 좋음 24

25 Ch14. 파일 입출력 실습 과제 <1>따라하기1 ~ 따라하기4 실습 25

26 Q&A 26


Download ppt "C언어 프로그래밍의 이해 Ch14. 파일 입출력."

Similar presentations


Ads by Google