최신 C 프로그래밍 언어 문제해결에서 프로그래밍까지

Download Report

Transcript 최신 C 프로그래밍 언어 문제해결에서 프로그래밍까지

최신 C 프로그래밍 언어
문제해결에서 프로그래밍까지
개정판
11장 : 파일 입출력
도서출판 - 인터비젼
1
11장 파일 입출력

학습목표




1.
2.
3.
4.
스트림과 파일 시스템을 이해한다.
파일 관련 표준 함수를 이해한다.
순차 파일과 이진 파일에 대해 이해한다.
표준 입출력 함수를 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
2
목차

11장 파일 입출력
 예습시간
– 스트림과 파일 그리고 표준 입출력
– 파일 입출력 함수
 실습시간
– 텍스트 파일 활용
– 이진 파일 활용
 연습시간
– 파일 입출력 분석
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
3
예습시간 – 1 교시
스트림과 파일 그리고 표준 입출력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
4
스트림과 파일 그리고 표준 입출력

학습 개요
 외부장치와의 논리적인 흐름을 나타내는 스트림을
이해한다.
 스트림과 파일의 관계를 이해한다.
 표준 입/출력 함수들에 대해 다룬다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
5
스트림과 파일 그리고 표준 입출력

스트림(Stream)과 파일(File)
 스트림(Stream)
–
–
–
–
컴퓨터와 연결된 여러 주변장치와의 논리적인 흐름
주변장치와 연결하는 접속 채널의 개념
컴퓨터와 주변장치의 정보전달은 스트림을 통해 이루어짐
모든 정보는 스트림을 통해 전달
 파일
– C언어에서 파일은 모든 주변 장치를 포함한다.
»
»
»
»
»
»
디스크에 저장된 파일
디스플레이 화면
키보드
프린터
직/병렬 포트
테이프 등등…
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
6
스트림과 파일 그리고 표준 입출력

스트림과 파일
 스트림과 파일의 관계
– 스트림은 파일을 연결하기 위한 논리적인 접근 통로
– 오픈된 스트림을 통해 정보를 전달하거나 받아들임
– 스트림 사용을 위해서는 항상 오픈(Open) 되어야하고 사용 후
닫아(Close) 주어야 한다.
 C언어에서 제공되는 표준 입/출력 장치
– 키보드 : 표준 입력 장치
– 디스플레이 화면 : 표준 출력 장치
 표준 스트림
– 표준 입/출력 장치의 연결을 위해 사용되는 스트림
– C 프로그램 시작시 자동적으로 오픈되어 사용 가능하다.
– 종류
» stdin : 표준 입력 스트림 (키보트와 연결된 스트림)
» stdout : 표준 출력 스트림 (디스플레이 화면과 연결된 스트림)
» stderr : 표준 에러 스트림 (디스플리이 화면과 연결된 스트림)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
7
스트림과 파일 그리고 표준 입출력

표준 입출력 함수
 표준 입/출력 스트림을 이용하는 함수
 표준 입/출력 함수 정의 헤더 파일
– stdio.h
 표준 입출력 함수의 종류
–
–
–
–
형식이 있는 입출력 함수 – printf(), scanf()
단일 문자 입출력 함수 – getchar(), putchar()
문자열 입출력 함수 – gets(), puts()
버퍼형 입출력 함수 – sscanf(), sprintf()
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
8
스트림과 파일 그리고 표준 입출력

단일 문자 입출력 함수
 단일 문자 입력 함수 – getchar()
– 함수의 원형
» int getchar()
– 키보드로 부터 하나의 문자를 입력 받는다.
– 리턴 결과
» 정상적 수행 : 해당 문자에 대한 ASCII 코드 값
» 비정상적 수행 : EOF 값 반환
 단일 문자 출력 함수 – putchar()
– 함수의 원형
» int putchar(int ch)
– 화면에 ch에 해당되는 문자를 출력
– 리턴 결과
» 정상적 수행 : 입력된 값이 반환
» 비정상적 수행 : EOF 값 반환
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
9
스트림과 파일 그리고 표준 입출력

단일 문자 입/출력 함수 사용 예









01 #include <stdio.h>
02 void main(){
03
char ch;
04
printf("한문자 입력 :");
05
ch = getchar(); // 한 문자 입력
06
printf("입력받은 결과 출력 : ");
07
putchar(ch); // 입력받은 문자 출력
08
putchar('\n'); // 특수 문자 출력
09 }
입력된 문자 출력
 출력 결과 : _______________
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
10
스트림과 파일 그리고 표준 입출력

문자열 입출력 함수
 문자열 입력함수 – gets()
– 함수의 원형
» char *gets(char *str);
–
–
–
–
–
–
키보드로 부터 입력된 문자열 값을 저장
*str : 입력된 문자열 저장 주소
입력된 문자열은 키보드로부터 <Enter>키를 누른 위치까지 포함
공백문자도 문자열에 포함됨
<Enter>값은 자동적으로 '\0'(NULL) 값으로 변경되어 저장됨
반환 결과
» 정상적일 경우 : 저장된 문자열의 주소
» 비정상적일 경우 : EOF 값
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
11
스트림과 파일 그리고 표준 입출력

문자열 입출력 함수
 문자열 출력함수 – puts()
– 함수의 원형
» int puts(char *str);
– 입력된 문자열(*str)을 화면에 출력
– 출력시 '\0' 값은 '\n'(Enter) 값으로 변형되어 출력
– 반환 결과
» 정상적일 경우 : 음이 아닌 값
» 에러 발생 시 : EOF 값 반환
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
12
스트림과 파일 그리고 표준 입출력

문자열 입출력 함수 사용 예











01 #include <stdio.h>
02 void main(){
03
char buffer[80], *bp;
04
printf("문자열 입력 : ");
05
bp = gets(buffer); // 문자열 입력
06
if(bp != EOF){ // 정상적인 입력 시
07
puts("입력된 문자열");
08
puts(bp); // 포인터를 통한 출력
09
puts(buffer); // 배열을 통한 출력
10
}
11 }
 입력 값 : 안녕하세요 여러분
안녕하세요 여러분
 출력 결과:_____________________
안녕하세요 여러분

:_____________________
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
13
스트림과 파일 그리고 표준 입출력

버퍼형 입출력 함수
 형식을 가진 형태로 표준입출력 스트림이 아닌 문자열
변수공간(Buffer)에 값을 저장하거나 읽어올 때 사용
 버퍼형 입력 함수 – sscanf()
– 함수의 원형
» int sscanf(char *buffer, char *format [,argument ] ... );
–
–
–
–
buffer : 입력 데이터가 존재하는 문자열 주소
format : 형식지정문자를 포함한 문자열
argument : 값을 저장할 변수 리스트
문자열로 저장된 데이터를 형식에 맞도록 추출할 목적으로 사용
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
14
스트림과 파일 그리고 표준 입출력

버퍼형 입력 함수 사용 예







01 #include <stdio.h>
02 void main(){
03
char token[] = "128 14.8 language";
04
int i;
05
float f;
06
char name[80];
07
//문자열로부터 각각의 데이터 추출
 08
sscanf( token, "%d %f %s", &i,&f,name );
 09
//추출 내용 출력
 10 printf( "Integer = %d, Float = %f, String = %s\n", i,f,name );
 11 }
128
14.8
language
 출력 결과 : _________________________________________
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
15
스트림과 파일 그리고 표준 입출력

버퍼형 출력함수 – sprintf()
 형식화된 문자열을 화면이 아닌 문자열 변수에 저장
 여러 데이터 유형을 문자열로 만들 때 유용
 함수의 원형
– int sprintf(char *buffer, char *format [,argument] ... );




buffer : 출력할 문자열의 주소
format : 형식지정문자를 포함한 문자열
argument : 값을 저장하고 있는 변수 리스트
buffer에 출력된 문자열의 수 반환
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
16
스트림과 파일 그리고 표준 입출력

버퍼형 출력함수 사용 예















01
02
03
04
05
06
07
08
09
10
11
12
#include <stdio.h>
void main()
{
char buffer[200];
int i = 28,j;
double d = 1.3456;
char c='x';
char str[] = "c programming";
j = sprintf(buffer,"i= %d, d = %f, c= %c \n",i,d,c);
j = sprintf(buffer + j, "str = %s", str);
puts(buffer);
}
i= 28, d = 1.3456, c= x
출력결과 :__________________________________
c programming
______________________________________
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
17
예습시간 – 2 교시
파일 입출력 함수
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
18
파일 입출력 함수

학습 개요




일반 파일에 대한 처리 과정을 이해한다.
파일 시스템과 파일 조작함수에 대해 다룬다.
파일의 종류와 이 파일의 입출력 함수들에 대해 알아본다.
파일의 임의 접근 방식에 대해 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
19
파일 입출력 함수

파일 시스템의 개요
 파일에 데이터를 쓰거나 읽기 위해 스트림 형성이 필요
 파일에 스트림 형성 방법
– 파일 포인터 이용
 파일 포인터
– 파일을 가리키는 FILE 타입의 구조체
 FILE 포인터를 이용한 파일 입출력 단계
– 1. 파일 포인터 선언
» FILE *fp; // fp는 파일 포인터 변수
– 2. 파일 포인터를 이용해 파일 열기
» fp = fopen(…); // 파일 오픈 후 그 파일에 대한 포인터 반환
– 3. 파일에 대한 입/출력 처리
» 파일 포인터 fp을 이용한 파일 입/출력 처리
– 4. 파일 닫기
» fclose(fp); // 사용 후 파일 포인터를 이용해 해당 파일 닫기
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
20
파일 입출력 함수

파일 조작 함수
 파일 열기와 닫기
– 파일 스트림의 연결과 닫기
– fopen 함수
– fclose 함수
 파일 검사
– 입출력 과정에서 발생된 에러 확인
– feof 함수
– ferror 함수
 기타 파일 조작 함수
– 파일의 제거 및 이름 변경
– rename 함수
– remove 함수
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
21
파일 입출력 함수
 파일 열기 (fopen 함수)
– 함수의 원형
» FILE* fopen(char *filename, char*mode);
 filename : 파일의 이름
 mode : 파일에 대한 접근 방법
 반환 값 : 파일에 대한 포인터 (FILE *)
»mode의 종류
mode 종류
설
명
"r"
읽기용 텍스트 파일 오픈, 파일이 존재해야 함
"w"
쓰기용 텍스트 파일 오픈, 파일 미 존재 시 새롭게 생성, 존재 시 내용 무시
"a"
추가용 텍스트 파일 오픈, 기존의 내용 보존되고 새롭게 내용 추가
"rb"
읽기용 이진 파일 오픈, 파일 존재해야 함
"wb"
쓰기용 이진 파일 오픈, 파일 미 존재 시 새롭게 생성, 존재 시 무시
"ab"
추가용 이진 파일 오픈, 기존 내용 보존, 새로운 내용 추가
"r+"
읽기/쓰기용 텍스트 파일 오픈, 파일 존재해야 함
"w+"
읽기/쓰기용 텍스트 파일 오픈, 파일 미 존재 시 생성, 존재 시 무시
"a+"
읽기/추가용 텍스트 파일 오픈, 파일 존재 시 내용 추가, 미 존재 시 생성
"rb+"
읽기/쓰기용 이진 파일 오픈, 파일 존재해야 함
"wb+"
읽기/쓰기용 이잔 파일 오픈, 파일 미 존재 시 생성, 존재 시 무시
"ab+"
읽기/추가용 이진 파일 오픈, 파일 존재 시 내용 추가, 미 존재시 생성
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
22
파일 입출력 함수
 파일 열기 (fopen 함수)
– fopen의 정상적 수행 시 해당 파일의 포인터를 리턴 하지만 실패
시 NULL 값을 리턴
– 파일 오픈 과정에서 에러 확인 필요
– 사용 예>
»
»
»
»
»
»
»
1
2
3
4
5
6
7
FILE *fp;
...
fp = fopen("test.dat","r");
if(fp == NULL){
printf(" 파일오픈 실패 !“);
exit(1);
}
 파일 닫기 (fclose 함수)
– 함수 원형
» int fclose(FILE *fp);
– 오픈된 파일은 사용 후 반드시 닫아야 한다.
– 열려진 파일 포인터를 인지를 화여 fclose 함수 호출
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
23
파일 입출력 함수
 파일 입출력 과정
– 파일 입출력 과정은 버퍼 공간을 통해 이루어진다.
– 시스템에 의해 자동적으로 버퍼의 공간에 저장된 데이터 파일로
출력
– 버퍼의 사용 목적
» 두 시스템간의 완충 작용 ( CPU와 주변장치 사이)
» 두 시스템 사이의 처리 속도 문제 해결
– 필요에 따라 버퍼의 내용을 강제적으로 출력 하고자 할 경우에는
fflush 함수를 사용한다.
 fflush 함수
– 버퍼의 내용을 강제적으로 파일에 작성하고 버퍼 비우는 역할
수행
– 함수의 원형
» int fflush(FILE *fp);
 fp : 오픈된 파일의 포인터
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
24
파일 입출력 함수

파일 검사 함수 ( feof / ferror )
 feof 함수
– 파일의 끝에 정상적으로 도달 했는지의 여부 검사
– 함수의 원형
» int feof(FILE *fp);
» 처리 결과
 fp가 파일의 끝에 도달할 경우 : 0이 아닌 값
 그렇지 않을 경우 : 0
 ferror 함수
– 파일에 에러가 존재하는지의 여부 검사
– 함수의 원형
» int ferror(FILE *fp);
» 처리 결과
 파일 처리 과정 중 에러 발생 시 : 0이 아닌 값
 그렇지 않을 경우 : 0
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
25
파일 입출력 함수

기타 파일 조작 함수 ( rename / remove )
 rename 함수
– 파일의 이름을 변경
– 함수의 원형
» int rename(char *oldname, char*newname);
 oldname : 변경할 파일 이름
 newname : 새롭게 변경될 파일 이름
 remove 함수
– 해당 파일을 삭제
– 함수의 원형
» int remove(char*path);
 path : 제거할 파일의 경로(이름)
 두 함수다 정상적 수행 후 결과 값을 0으로 그렇지 않을
경우 0이 아닌 값을 반환한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
26
파일 입출력 함수

텍스트 파일 입/출력 함수
 텍스트로 오픈된 파일의 조작함수
 단일 문자 입출력 함수
– 함수의 종류
»
»
»
»
int
int
int
int
getc( FILE *stream); // 스트림으로부터 한 문자 입력 매크로
fgetc( FILE *stream); // 스트림으로부터 한 문자 입력 함수
putc( int c,FILE* stream); // 스트림에 한 문자 출력 매크로
fputc( int c,FILE* stream); // 스트림에 한 문자 출력 함수
– 처리 결과
» 정상적 수행
 해당 문자를 반환하고 파일 포인터를 1중가 시킴
» 파일의 끝이거나 오류 발생
 EOF(-1) 값 반환
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
27
파일 입출력 함수
 단일 문자 입출력 함수 사용 예
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
24
#include <stdio.h>
#include <stdlib.h> // exit()함수
int main(){
FILE *rfp, *wfp;
char c;
rfp = fopen("test.txt","r");
if(rfp == NULL){
printf("test.txt 파일이 존재하지 않습니다.\n");
exit(1);
}
wfp = fopen("copy.txt","w");
if(wfp == NULL){
printf("copy.txt 파일생성이 오류 발생.\n");
exit(1);
}
while((c=fgetc(rfp)) != EOF){
fputc(c,wfp);
}
fclose(rfp);
fclose(wfp);
printf("text.txt 을 copy.txt파일로 복사 완료 되었습니다.\n");
return 0;
}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
28
파일 입출력 함수

문자열 입출력 함수 (fgets / fputs)
 텍스트 파일에 대한 문자열 입출력 제공
 fgets()함수
– 문자열 입력 함수
– 입력 스트림으로부터 n-1개의 문자를 읽어 들여 문자열 변수에
저장
– 문자열 입력 시 '\n'문자를 만나면 그때까지의 문자열을 저장
– 문자열 마지막에 '\0'문자 자동 포함
– 함수의 원형
– char *fgets( char* string, int n, FILE *stream);
»
»
»
»
»
string : 문자열 저장 버퍼
n
: 입력 최대 문자 수
stream : 입력용 파일 포인터
반환 값 : 파일의 끝이나 에러 발생시 EOF
정상적일 경우 저장된 문자열의 주소
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
29
파일 입출력 함수
 fgets() 함수 사용 예
–
–
–
–
–
–
–
–
–
–
–
01 #include <stdio.h>
02 void main(){
03
FILE *stream;
04
char line[30];
05
if( (stream = fopen( "test.txt", "r" )) != NULL ){
06
while( fgets(line, 30, stream ) != NULL){
07
printf( "line = : [%s]\n", line);
08
}
09
fclose( stream );
10
}
11 }
실행 화면
 입/출력 결과
test.txt 파일
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
30
파일 입출력 함수
 fputs 함수
– 문자열을 파일에 작성하기 위해 사용
– 문자열을 파일로 출력할 때 문자열의 맨 마지막에 존재하는 '\0'
(NULL)문자는 출력 되지 않는다.
– 함수의 원형
» int fputs( char *string, FILE *stream);
 string : 출력할 문자열
 stream : 출력 대상 파일 포인터
 반환 값 : 에러 발생시 EOF 발생

정상적인 출력 시 음수가 아닌 값을 반환
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
31
파일 입출력 함수
 fputs()함수 사용 예
–
–
–
–
–
–
–
–
–
01 #include <stdio.h>
02 void main(){
03
FILE *stream;
04
static char string[] = "Binary Files\nText Files";
05
if( (stream = fopen( "file.txt", "w" )) != NULL ){
06
fputs(string,stream);
07
}
08
fclose( stream );
09 }
– 출력 결과 :
–
Binary Files
______________________
Text Files
______________________
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
32
파일 입출력 함수

형식을 갖춘 파일 입출력 ( fprintf / fscanf )
 fprintf() 함수
– 형식을 포함하여 파일에 텍스트 문자열 작성
– printf() 함수와 비슷하지만 출력 위치가 파일이다.
– 함수 원형
» int fprintf( FILE* stream, char*format [, argument ]...);





stream : 출력 파일 포인터
format : 형식 지정 문자을 포함한 출력 문자열
argument : 인수 리스트
반환 값 : 정상적인 수행 시 출력한 바이트 수를 리턴
오류 발생 시 음수 값 리턴
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
33
파일 입출력 함수
 fscanf() 함수
– 형식을 포함하여 텍스트 파일로부터 값 읽기
– scanf와 동일하게 사용되며 표준 입력 장치가 아닌 파일로부터
입력
– 표준 입력 장치의 파일의 끝 ( CTRL + Z )
– 함수의 원형
» int fscanf( FILE *stream, char *format [, argument ]... );





stream : 입력 파일 포인터
format : 입력 형식 제어 문자열
argument : 인수 리스트
반환 값 : 정상적인 수행 시 인수의 개수를 반환
파일의 끝이나 에러 발생시 EOF 반환
 이 두 함수에서 입력 파일 포인터를 stdin(표준 입력)으로
출력 파일 포인터를 stdout(표준 출력)으로 지정 시
scanf()와 printf()함수와 동일한 효과 발생
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
34
파일 입출력 함수
 형식을 갖춘 파일 입출력 함수 사용 예
–
–
–
–
–
–
–
–
01 #include <stdio.h>
02 void main(){
03 FILE *in,*out;
04
int
ivalue = 128, i;
05
float fvalue = 2.35f, f;
06
char str[] = "textfile", s[80];
07
// 파일 쓰기
08
out = fopen( "file.txt", "w" );
– 09
–
–
–
–
10
11
12
13
fprintf(out, "%d %f %s", ivalue, fvalue, str );
fclose(out);
// 파일 읽기
in = fopen("file.txt","r");
if(in != NULL){
– 14
– 15
–
–
–
–
16
17
18
}
19 }
fscanf(in,"%d %f %s",&i,&f,s);
fprintf(stdout,"int = %d , double = %f \n", i,f);
printf("str = %s \n",s);
fclose(in);
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
35
파일 입출력 함수

이진 파일 입/출력 함수 (fread / fwrite)
 문자 변환 없이 이진 파일의 입/출력 함수
 fread 함수
– 이진데이터의 입력 함수
– 함수의 원형
» size_t fread(void *buffer,size_t size,size_t count,FILE *stream );







buffer : 저장할 데이터 위치
size : 읽을 데이터의 크기
count : 읽을 데이터의 개수
stream : 읽을 파일 포인터
반환 값 : 정상적일 경우 읽은 데이터의 개수
파일의 끝이나 오류 발생시 실제 읽은 데이터의 개수로
count 값보다 작은 값 반환
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
36
파일 입출력 함수
 fwrite 함수
– 이진 파일의 출력 함수
– 함수의 원형
» size_t fwrite(void *buffer,size_t size,size_t count,FILE *stream );






buffer : 저장 대상 데이터 위치
size : 작성할 데이터의 크기
count : 작성할 데이터의 개수
stream : 작성할 파일 포인터
반환 값 : 실제 저장된 데이터의 개수
오류 발생시 count 값보다 작은 값 반환
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
37
파일 입출력 함수
01 #include <stdio.h>

02 void main(){
03
FILE *in, *out;
04
static int ivalue[] = {100,200,300};
05
int iresult[3], i, cnt;
26
06
//쓰기용 이진 파일 열기
27
07
out = fopen("file.bin","wb");
28
08
if(out==NULL){
29
09
printf("file.bin 파일 열기 실패 !");
30
10
return;
31
11
}
32
12
// 값 저장
33
13
cnt = fwrite(ivalue,sizeof(int),3,out);
34
14
if(cnt != 3) {
35
15
printf("ivalue 쓰기 실패 !\n");
36
16
fclose(out);
37
17
return;
38
18
}
39
19
fclose(out);
40
20
//읽기용 이진 파일 열기
41
21
in = fopen("file.bin","rb");
42
22
if(in==NULL){
43
23
printf("file.bin 파일 열기 실패 !\n"); 44
24
return;
45
25
}
46 }
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
fread와 fwrite 함수 사용 예
// 정수 값 읽기
i=0;
do{
cnt=fread(&iresult[i],sizeof(int),1,in);
i++;
}while(cnt == 1);
if(ferror(in)){
printf("파일 읽기 에러 !\n");
fclose(in);
return;
}
if(feof(in)){
printf(" 파일읽기 완료 !\n");
printf(" 결과 데이터 : ");
for(i=0; i<3;i++){
printf("%5d",iresult[i]);
}
printf("\n");
}
fclose(in);
38
파일 입출력 함수

임의 파일 접근 함수 (fseek, ftell, rewind)
 일반적인 파일 입출력
– 순차적 접근 방식
– 순차적으로 값을 읽고 자동적으로 파일 포인터 증가 방식
 임의 접근 방식
– 읽고자 하는 위치로 파일 포인터 이동
 임의 파일 접근 함수의 종류
– fseek
– ftell
– rewind
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
39
파일 입출력 함수
 fseek 함수
– 파일 포인터를 원하는 위치로 이동 시키는 함수
– 함수의 원형
» int fseek( FILE *stream, long offset, int origin );






stream : 파일 포인터
offset : 지정된 시작 위치에서부터 떨어진 바이트의 수
origin : 시작 위치
반환 값 : 정상적인 수행 후 파일 포인터 해당 위치로 이동,
결과 값 0반환
실패 시 0이 아닌 다른 값 반환
– 시작 위치(origin)의 종류
시작 위치 종류 (origin)
의 미
매크로 이름
값
SEEK_SET
0
파일의 최초 시작 위치
SEEK_CUR
1
파일 포인터가 위치한 현재 위치
SEEK_END
2
파일의 끝 위치
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
40
파일 입출력 함수
 fseek 함수 사용 예
– fseek(stream, 100L, SEEK_SET);
» 파일의 시작 위치에서 100바이트 떨어진 위치로 파일 포인터 이동
– fseek(stream, 30L, SEEK_CUR);
» 파일포인터의 현재 위치에서 30바이트 증가된 위치로 파일 포인터 이동
– fseek(stream, -20L, SEEK_END);
» 파일의 끝 위치에서 20바이트 감소된 위치로 파일 포인터 이동
 ftell 함수
– 현재의 파일 포인터 위치 반환 함수
– 함수의 원형
» long ftell( FILE *stream);
 stream : 파일 포인터
 반환 값 : 정상적으로 수행 시 파일 포인터의 현재 위치 반환

실패 시 -1값을 반환
 rewind 함수
– 파일 포인터의 위치를 처음으로 이동
– 함수의 원형
» void rewind( FILE *stream);
 stream : 파일 포인터
 반환 값 : 없음 (파일 포인터의 위치를 처음으로 이동)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
41
파일 입출력 함수
 fseek, ftell 그리고 rewind 함수 사용 예
01 #include <stdio.h>
02 void main(){
03
FILE *in;
04
int result1,result2, seek;
05
//읽기용 이진 파일 열기
06
in = fopen("file.bin","rb");
07
if(in==NULL){
08
printf("file.bin 파일 열기 실패 !\n");
09
return;
11
// 정수 값 읽기
10
}
12
13
14
15
16
17
18
seek = fseek(in,-(sizeof(int)),SEEK_END);
if(seek == 0){ // 정상적인 이동
printf("locattion after seek : %d \n", ftell(in));
fread(&result1,sizeof(int),1,in);
printf("feek = %d\n",result1);
rewind(in);
printf("location after rewind : %d \n", ftell(in));
19
fread(&result2,sizeof(int),1,in);
20
printf("rewind = %d\n",result2);
21
}
22
fclose(in);
23 }
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
42
실습시간 – 1 교시
텍스트 파일 활용
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
43
텍스트 파일 활용

학습개요
 예제를 통한 텍스트 파일 관련 함수를 이용한다.
 간단한 텍스트 문서 편집기를 만든다.
 문자 조작 함수를 사용한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
44
텍스트 파일 활용

텍스트 편집기
 문제 정의
– 텍스트 편집기는 다양한 분야에서 활용되고 있다. 이러한 텍스트 편집기로 동작
가능한 프로그램을 만들어 보자. 만들 텍스트 편집기의 기능은 새 파일 작성,
불러오기, 저장하기 기능과 라인단위의 수정 기능을 포함하고 있다. 새 파일
작성은 키보드로부터 문자열을 입력 받아 문자열 공간에 저장하고 이 내용을
새로운 파일로 작성한다. 불러오기는 특정 파일을 읽어 화면에 출력시킨다. 또한
수정 기능은 라인 단위의 수정 기능만을 제공한다. 이러한 내용을 만족하는
텍스트 편집기를 작성 하시오.
 입/출력 조건
– 입력 조건
»
»
»
»
»
»
»
»
»
1. 작업 선택(1: 새파일, 2: 열기, 3: 수정 , 4: 종료)
2. 새 파일 선택 시 문자열
입력 문자열 입력 종료는 [CTRL + Z] 입력 - [EOF 의미]
입력 종료 시 저장 여부 확인
3. 불러오기 선택 시 파일의 이름 입력
4. 수정하기 선택 시 수정할 파일 이름 입력
수정을 위해 라인과 문자열 입력
수정 후 저장 여부 확인
6. 텍스트로 저장할 문자열의 크기는 1024 바이트로 한정한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
45
텍스트 파일 활용
 입/출력 조건
– 출력 조건
» 1. 불러오기 선택 시 해당 파일의 내용을 화면에 출력
» 2. 수정하기 선택 시 먼저 선택된 파일을 라인단위로 출력
»
수정 여부에 대한 메시지 출력
 관련 함수 및 식
– 1.텍스트 기반 파일 관련 함수 (<stdio.h>)
»
»
»
»
fopen(), fclose() // 파일 열기와 닫기
gets(), puts() // 표준 입출력을 통한 문자열 읽기와 쓰기
getchar()
// 표준 입력으로부터 한 문자 입력
fputs(), fgets() // 파일에 문자열 읽기와 쓰기
– 2.문자열 조작함수(<string.h>)
» strcat()
// 문자열 결합
– 3.기타 함수
» tolower()
// 한 문자를 소문자로 <ctype.h>
» fflush()
// 버퍼비우기 <stdio.h>
» system("cls") // 화면 클리어 <windows.h>
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
46
텍스트 파일 활용
 알고리즘 (또는 플로우 차트)
– 1) 작업 선택(1:새파일 2: 열기 3: 수정 4: 종료)
» 1.1 새파일 작업 선택 시
 1.1.1 <CTRL>+Z 값을 만날 때 까지 문자열을 입력 받는다.
 1.1.2 입력 문자열 저장

1.1.2.1 저장할 이름 입력

1.1.2.1 내용 저장
» 1.2 열기 선택 시
 1.2.1 열기를 원하는 파일 이름 선택
 1.2.1 화면에 라인단위로 출력
» 1.3 수정 선택 시
 1.3.1 수정 파일에 대한 내용을 화면에 출력
 1.3.2 수정을 위한 라인 번호와 문자열 입력
 1.3.2 파일에 수정 결과 반영
– 2) 종료를 선택하기 전까지 1)을 계속해서 반복한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
47
텍스트 파일 활용
 프로그램 구조체차트
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
48
텍스트 파일 활용

프로그램 작성
 1 단계
– 349페이지의 프로그램을 위의 분석된 내용을 토대로 작성한 후
editor.c 파일로 저장하자.
①. getchar()
②. getchar()
③. gets(line) != NULL
④. strcat(pb,snum)
⑤. fp = fopen(fname,"w");
⑥. strcat(bp,str);
⑦. strcat(bp,"\n");
⑧. strcat(bp,line)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
49
텍스트 파일 활용
 2 단계
– 다음 입력 조건에 대한 결과를 작성하여 보자
출력 결과
입력 조건
아래 순서대로 입력 하시오.
선택 : 1 (새파일)
[입력 문자열]
안녕하세요
여기는 대한민국 입니다.
Good Bye!
ꍭ+Z
파일 저장여부 : y
파일 이름 :mail.txt
---------------------선택 : 2 (열기)
불러올 파일 이름 : mail.txt
---------------------선택 : 3 (수정)
수정할 라인 번호 : 2
수정 내용 : 여기는 서울 입니다.
------------------------선택 : 2 (열기)
불러올 파일 이름 : mail.txt
------------------------선택 : 4 (종료)
선택 1 결과 :
선택 2 결과 :
선택 3 결과 :
선택 4 결과 :
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
50
텍스트 파일 활용
 입력 조건에 대한 결과 작성 (계속)
입력 조건
출력 결과
아래 순서대로 입력 하시오.
선택 : 1 (새파일)
[입력 문자열]
Binary Files
A file is a collection of data
파일은 데이터의 집합이다.
텍스트 파일 저장
End Text
ꍭ+Z
파일 저장여부 : y
파일 이름 :file.txt
---------------------선택 : 2 (열기)
불러올 파일 이름 : file.txt
---------------------선택 : 3 (수정)
수정할 라인 번호 : 1
수정 내용 : 문서 내용
선택 : 3 (수정)
수정할 라인 번호 : 4
문서 수정됨
-------------------------선택 : 2 (열기)
불러올 파일 이름 : file.txt
-------------------------선택 : 4 (종료)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
51
실습시간 – 2 교시
이진 파일 활용
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
52
이진 파일 활용

학습개요
 구조체를 이용한 이진 파일 활용방법을 익힌다.
 이진파일 관련 함수의 사용법을 이해한다.
 도서정보 검색 프로그램을 작성한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
53
이진 파일 활용

도서정보 검색 프로그램
 문제 정의
– 한 서점에서 보유한 책에 대한 정보를 제공하는 프로그램을
만들려고 한다. 프로그램 시작 시 서점에 보유한 책의 리스트를
보여주고 해당 목록번호를 입력 시 그 책에 대한 자세한 정보를
제공할 수 있도록 작성하여 보자. 프로그램 시작 시 책에 대한
리스트 정보와 세부정보가 이진 파일로 저장되어지고 이 저장된
내용을 이용해 검색할 수 있도록 프로그램을 작성하여라.
 입/출력 조건
– 입력 조건
» 세부정보를 원하는 책의 목록 번호
– 출력 조건
» 목록 번호에 대한 책의 세부 내용 출력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
54
이진 파일 활용
 관련 함수 및 식
– 1. 목록리스트와 이 리스트에 대한 세부 정보가 프로그램 시작 시
만들어 진다.
– 2. 목록리스트와 세부정보는 구조체 형태를 가지며 이진 형태로
저장된다.
– 3. 목록 리스트의 구조체
목록 구조체 타입 (LIST)
목록번호
간략한 책이름
(int number)
(char sname[20])
– 4. 세부 정보에 대한 구조체
도서 세부 정보 구조체 타입 (DETAIL)
목록번호
책이름
출판사
가격
보유량
int number
char name[40]
char pub[20]
int price
int amount
– 5. 세부 정보들은 목록 순서로 파일에 저장된다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
55
이진 파일 활용
 알고리즘 (또는 플로우차트)
– 1. 데이터를 초기화 한다.
»
»
»
»
1.1
1.2
1.3
1.4
목록 리스트를 만든다.
만들어진 목록리스트를 파일로 저장한다.
목록에 대한 세부정보들을 만든다.
세부정보를 파일로 저장한다.
– 2. 검색 대상 선택
» 2.1 목록 리스트 파일로부터 리스트를 읽어와 화면에 출력
» 2.2 세부정보를 원하는 도서 목록 번호 입력
– 3. 세부 목록 출력
» 3.1 도서 목록 번호로 읽어올 세부 정보 선택
» 3.2 세부 정보 출력
– 4. 계속할 것인지 아닌지 여부 확인
» 4.1 계속 수행 할 경우 1,2,3번을 반복한다.
» 4.2 계속 수행 하지 않을 경우 프로그램 종료
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
56
이진 파일 활용
 프로그램 구조체차트
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
57
이진 파일 활용

프로그램 작성
 1 단계
– 위에서 분석된 내용을 기반으로 페이지 359에 존재하는
프로그램의 빈 부분을 완성하고 프로그램을 작성한 후
booksearch.c 파일로 저장하자.
①.
②.
③.
④.
⑤.
⑥.
displayDetail(num)
list,sizeof(LIST),5,fp1
details,sizeof(DETAIL),5,fp2
fopen("list.bin","rb")
&line,sizeof(LIST),1,fp
fp,num*sizeof(DETAIL),SEEK_SET
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
58
이진 파일 활용
 2 단계
– 아래의 입력데이터에 대한 출력 결과를 작성해 보자.
입력 조건
출력 결과
입력 :
세부정보를 원하는 목록 번호 : 3
입력 :
세부정보를 원하는 목록 번호 : 5
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
59
파일 입출력
The End.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
60