150 likes | 382 Views
C 프로그래밍. 12 장. 강의 내용. 12. 파일 입출력 • 파일 (File), fopen() 함수 • 파일 입출력 , fprintf(), fscanf(), fputs() • 무작위 액세스 , fseek() 와 ftell() 함수 • fflush(), fread(), fwrite() 함수 • feof() 함수. - 파일 (file) 이란 ? 일렬로 나열된 바이트로 저장된 데이터 공간 - 텍스트 파일 (text file)
E N D
C 프로그래밍 12장
강의 내용 12. 파일 입출력 • 파일(File), fopen()함수 • 파일 입출력, fprintf(), fscanf(), fputs() • 무작위 액세스, fseek()와 ftell()함수 • fflush(), fread(), fwrite()함수 • feof()함수
- 파일(file)이란? 일렬로 나열된 바이트로 저장된 데이터 공간 - 텍스트 파일(text file) 텍스트 파일에서 “한 줄의 끝”을 나타내는 표현은 파일이 읽어들여질 때, C 내부의 방식으로 변환됨. 파일을 읽어들일 때는 \r\n을 \n으로 변환하고 파일에 저장할 때는 \n을 \r\n으로 변환해서 저장 한다. 일반 텍스트 파일, 키보드로 입력한 문자 데이터들을 저장. - 바이너리 파일(binary file) 바이너리 파일은 \r \n을 인식할 수 있고, 변환할 필요가 없다. 음성, 동영상, 그림 파일. - C에서는 두 종류의 화일을 모두 다룰 수 있는 함수들에 제공 됨.
- 표준 파일 C프로그램은 자동으로 세개의 파일을 오픈 한다. 이 파일의 명칭은 표준 입력(standard input), 표준 출력(standard output), 표준 에러 출력(standard error output). - 표준 입력 키보드와 같이 시스템에서 일반적으로 사용하는 입력장치로부터의 입력 getchar(), gets(), scanf()등의 함수를 사용. - 표준 출력과 표준 에러 출력은 모니터와 같이 시스템에서 일반적으로 사용하는 출력 장치로의 출력. Putchar(), puts(), printf()등의 함수를 사용.
- count.c 파일에 있는 문자의 개수를 알려주는 프로그램. /* count.c -- 표준 입.출력 사용 예 */ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int ch; FILE *fp; long count=0; if(argc != 2) { printf(“Usage : %s filename \n”, argv[0]); exit(1); }
if ( ( fp=fopen(argv[1], “r”) ) == NULL) { printf(“Can’t open %s \n”, argv[1]); exit(1); } while( ( ch=getc(fp) ) != EOF) { putc(ch, stdout); count++; } fclose(fp); printf(“File %s has %ld characters\n”, argv[1], count); return 0; }
- fopen() 함수 파일을 열기 위해서 fopen()을 사용., 이 함수는 stdio.h에 선언되어 있음. FILE *fp; if (( fp=fopen(“words”, “a+”) ) == NULL ) { ...... } 모드 문자열 의 미 “r” 텍스트 파일을 읽기 위해서 오픈 한다. “w” 텍스트 파일을 쓰기 위해서 오픈 한다. “a” 텍스트 파일에 덧붙여 쓰기 위해서 오픈 한다. “r+” 텍스트 파일을 읽기 쓰기 위해서 오픈 한다. “w+” 텍스트 파일을 읽고 쓰기 위해서 오픈 한다.
- 표준 파일 stdio.h파일은 세 개의 파일 포인터를 다음과 같이 C프로그램에 의해 자동적으로 오픈된 세 개의 표준 파일에 연결 한다. 표준 파일 파일 포인터 일반적인 장치 표준 입력 stdin 키보드 표준 출력 stdout 화면 표준 에러 stderr 화면
addaword.c #include <stdio.h> #include <stdlib.h> #define MAX 20 int main(void) { FILE *fp; char w[MAX]; if (( fp=fopen(“words.txt”, “a+”) ) == NULL ) { fprintf(stdin, “Can’t open \” words \” file. \n”); exit(1); }
puts(“Enter words to add to the file: press the Enter”); puts(“key at the begining of a line to terminate.”); while( gets(w) != NULL && w[0] != ‘\0’ ) fprintf(fp, “%s “, w); puts(“File contents:”); rewind(fp); /*파일의 첫 포인터 위치로 반환*/ while( fscanf(fp, “%s”, w) == 1) puts(w); if ( fclose(fp) != 0 ) fprintf(stderr, “Error closing file \n”); return 0; }
- 무작위 액세스 : fseek()와 ftell()함수 • fseek()함수는 파일을 배열처럼 다룰 수 있게 하고, • ftell()이 오픈한 파일에서 특정 위치로 이동할 수 있게 해 준다. • 파일을 역순으로 출력하는 함수프로그램 • reverse.c • #include <stdio.h> • #include <stdlib.h> • #define CNTL_Z ‘\032’ • int main(int argc, char *argv[]) • { • char ch; • FILE *fp; • long count, last;
if ( argc != 2 ) { printf(“Usage : reverse file \n”); exit(1); } if ( ( fp=fopen(argv[1], “rb”) ) == NULL ) { printf(“reverse can’t open %s \n”, argv[1]); exit(1); } fseek( fp, 0L, SEEK_END ); /* 파일 끝으로 이동 */ last = ftell(fp); for ( count = 1L ; count <= last; count++) { fseek( fp, -count, SEEK_END ); ch = getc(fp);
if ( ch != CNTL_Z && ch != ‘\r’ ) putchar(ch); } fclose(fp); return 0; } - fseek()함수 첫번째 인수는 처리할 파일을 가리키는 FILE포인터. 두번째 인수는 오프셋(offset),이 전달 인자는 시작 위치에서 얼마만큼 떨어져 있는 곳인가를 알려 줌. 세번째 인수는 모드(mode)이다. 모드는 시작 위치를 표시. stdio.h에는 다음과 같은 모드 상수가 정의되어 있음. SEEK_SET 파일 선두 SEEK_CUR 현재 위치 SEEK_END 파일 끝
- 텍스트 모드에서 작동하도록 보장되는 fseek()의 호출 예 fseek( file, 0L, SEEK_SET ) 파일처음으로 이동 fseek( file, 0L, SEEK_CUR ) 현재 위치에 머무름 fseek( file, 0L, SEEK_END ) 파일 끝으로 이동 - int ungetc(int c, FILE *p) c에 저장된 문자를 입력 스트림에 반납한다. 화일 포인터는 하나 감소 한다. 문자를 읽지 않은 것 처럼 화일 포인터를 하나 감소 시킨다. - int fflush(FILE *fp) 아직 기록되지 않고 버퍼에 남아 있는 데이터를 fp가 가리키는 출력 파일에 보낸다. 버퍼 비우기 기능을 수행하는 함수이다.
- 이진 입,출력 함수 : fread()와 fwrite()함수 #define BUFSIZE 1024 char temp[1024]; bytes = fread( temp, sizeof(char), BUFSIZE , fp1 ); fwrite( temp, sizeof(char), bytes, fp2 ); - int feof(FILE *fp) 파일 포인터 fp가 파일의 끝을 탐지하면 0이 아닌 값을 리턴하고 아니면, 0을 리턴 한다.