ch.14 파일 강c v0.6

65
14. 파파 강 C 강강강강강 1

Upload: -

Post on 14-Apr-2017

843 views

Category:

Education


1 download

TRANSCRIPT

Page 1: Ch.14 파일 강c v0.6

1/65

14. 파일

강 C 프로그래밍

Page 2: Ch.14 파일 강c v0.6

2/65

14.1 main 함수와 인자

강 C 프로그래밍

Page 3: Ch.14 파일 강c v0.6

3/65

명령 인수

지금까지의 main 함수

int main (void) { }C:\> Program.exe ↲

프로그램 실행 시 인수를 넣어줄 수 있다 .– 함수 호출시 인수 전달과 같이 프로그램 실행에 인수를 넣는다 .C:\> Program.exe param

강 C 프로그래밍

프로그램에 “ param” 이라는 문자열을 전달

Page 4: Ch.14 파일 강c v0.6

4/65

명령 인수

강 C 프로그래밍

Program B 를 실행 (data 를 전달함 )

int main( char *data ){ . . .

}

Program A Program B

프로그램 호출

Program A 를 실행 (data 를 전달함 )

int main( char *data ){ . . .

}

명령창 (탐색기 ) Program A

프로그램 호출

Page 5: Ch.14 파일 강c v0.6

5/65

main 함수의 형식

int main(int argc, char *argv[ ])– argc : 인수의 개수

– argv : 인수의 내용 ( 문자열이 여러 개 올 수 있다 )– argc, argv 는 개발자가 정한 매개변수 이름 . 통상 argc, argv

를 쓴다 .

C:\> Program.exe myname 3 ↲– argc = 2– argv[0] = “Program.exe” – argv[1] = “myname”– argv[2] = “3” // 모두 문자열이다 .

강 C 프로그래밍

Page 6: Ch.14 파일 강c v0.6

6/65

main 함수의 형식

int main(int argc, char *argv[]){ int i;  for ( i = 0 ; i < argc ; i++ ) printf(“argv[%d] = %s\n“ , i , argv [ i ] );}

강 C 프로그래밍

Page 7: Ch.14 파일 강c v0.6

7/65

Visual Studio 의 활용

Visual Studio IDE 에서 명령 인수 지정 방법

강 C 프로그래밍

Page 8: Ch.14 파일 강c v0.6

8/65

명령 인수의 사용 예

int main ( int argc, char *argv[ ] ){ int select;  select = atoi(argv[1]); switch(select) { case 1 : // 1 번 방식으로 실행됨 case 2 : // 2 번 방식으로 실행됨

}}

강 C 프로그래밍

C:\> cardselect.exe 1 // 1 번 방식으로 실행

C:\> cardselect.exe 2 // 2 번 방식으로 실행

C:\> examresult.exe 1-1.dat1 학년 1 반 성적을 처리하였습니다 . // 1-1.dat 파일을 가지고 실행

C:\> examresult.exe 1-2.dat1 학년 2 반 성적을 처리하였습니다 . // 1-2.dat 파일을 가지고 실행

파일의 이름만 전달한 것일 뿐 , 프로그램 동작은 개발자가 직접 해주어야 한다 .

Page 9: Ch.14 파일 강c v0.6

9/65

미니 과제

다음의 계산 프로그램을 작성하라

– 숫자와 부호 사이에는 공백이 있다 . – 4 칙연산 모두 가능하다 .

C:\> calc.exe 2 + 32 + 3 = 5

힌트

– argc = 3, argv[1] = “2”, argv[2] = “+”, argv[3] = “3”;– atoi(argv[1]) = 2, atoi(argv[3]) = 3– argv[2][0] = ‘+’

C:

강 C 프로그래밍

Page 10: Ch.14 파일 강c v0.6

10/65

리디렉션 (redirection)

표준 입출력을 파일로 연결하는 것– C:\> program.exe < input.dat

• 프로그램 실행시 , 표준 입력 ( 키보드 ) 대신 input.dat 파일을 사용한다 .

– C:\> program.exe > output.txt• 프로그램 실행시 표준 출력 ( 화면 ) 대신 output.txt 파일을

사용한다 .– C:\> program.exe < input.dat > output.txt

장점– 매번 키보드로 입력할 것을 대체할 수 있다 . 파일을 바꾸면

입력도 바꿀 수 있다 .– 출력되는 결과물을 파일로 받아 나중에 천천히 볼 수 있다 .

스크롤되어 넘어가는 화면일 때 유용하다 .강 C 프로그래밍

주로 리눅스에서 사용

Page 11: Ch.14 파일 강c v0.6

11/65

14.2 파일의 개념

강 C 프로그래밍

Page 12: Ch.14 파일 강c v0.6

12/65

메모리

메모리

– 주메모리 : 속도가 빠르다 . 가격이 비싸다 . 휘발성 . 프로그램 실행에 필수적

– 보조메모리 : 속도가 느리다 . 가격이 싸다 . 영구적 . – 영구적인 자료 보관 , 대용량의 데이터는 보조메모리 이용

파일

– 이름 + 확장자 , 날짜 , 크기

– 폴더

강 C 프로그래밍

Page 13: Ch.14 파일 강c v0.6

13/65

C 언어의 파일

파일의 종류

– 텍스트 파일 – 문자로 구성된 파일 . 문자열을 저장한 것

• 확장자가 .txt, .log, .ini, .xml 로 구성된다 .• 문서 편집기 , 메모장을 통하여 내용을 쉽게 확인할 수 있다 .

– 이진 (binary) 파일 – 각종 숫자를 포함한 이진 데이터를 저장한 것 ( 포괄적 )• mp3, jpg, avi, .exe 를 비롯한 대부분의 파일

강 C 프로그래밍

Page 14: Ch.14 파일 강c v0.6

14/65

프로그램이 파일을 지원하면

강 C 프로그래밍

Program Program실행 종료 실행

시간변수값 저장 변수값 읽기

연속성

Program실행

데이터 읽기

Program실행

데이터 읽기

Program실행

데이터 읽기

① 프로그램 실행의 연속성

② 번거로운 데이터 입력 자동화

③ 데이터의 이동

Program A

데이터 파일

Program B

데이터 파일이동

프로그램이 한층강력해진다 .

Page 15: Ch.14 파일 강c v0.6

15/65

C 에서 파일 생성과 기록

파일 열기

– 파일 이름과 목적 ( 읽기 또는 쓰기 ) 지정

– 파일의 스트림 지시자 ( 핸들 ) 를 얻는다 .

파일 읽기 / 쓰기

– 용도에 맞도록 파일의 내용을 읽어 메모리로 가져오거나 , 메모리의 내용을 파일에 기록한다 .

파일 닫기

– 파일 작업이 완료되면 파일을 마무리한다 . – 파일을 닫으면 새로 열기 전까지 파일 접근을 할 수 없다 .

강 C 프로그래밍

Page 16: Ch.14 파일 강c v0.6

16/65

파일의 이름

파일 이름– 저장될 데이터의 특성을 잘 나타낼 수 있는 이름을 선택

– 문자열이므로 , “ ” 사이에 기록한다 . – 알파벳 , 숫자 , 일부 기호 사용 가능 . 대소문자 구별 없음 .– \, /, *, *, ?, “, <, >, | 는 사용 불가 ( 운영체제마다 다르다 )

폴더– 폴더와 폴더 , 폴더와 파일 이름 사이에 ‘ \’ 또는 ‘ /’ 을 붙여야

한다 ( 운영체제 지시 사항 . 리눅스의 경우 ‘ /’ )– “ ” 안에 \ 를 쓸 때에는 “ \\” 처럼 두 개를 써야 한다 (

이스케이프시퀀스 ).– 폴더 지정이 없으면 현재 폴더 ( 실행파일이 있는 곳 ) 이며 , Vis-

ual Studio 실행시 소스코드가 있는 폴더이다 .

강 C 프로그래밍

Page 17: Ch.14 파일 강c v0.6

17/65

읽기 쓰기 모드

파일을 열 때 모드를 지정해야 한다 .보통 읽기 또는 쓰기 중 하나를 지정한다 .– 두 가지를 모두 하더라도 , 읽기를 모두 한 후 , 쓰기를 한다 .– 두 가지 일을 섞어서 하면 관리가 어렵고 성능도 저하된다 .

읽기를 하려면 파일이 존재해야 한다 .– 없으면 에러

쓰기를 하려면 파일 존재가 무관하다 .– 있으면 기존 파일 삭제 (따라서 주의 )

강 C 프로그래밍

Page 18: Ch.14 파일 강c v0.6

18/65

파일과 운영체제

파일 관리는 운영체제의 역할이다 ( 메모리처럼 ).FILE 구조체는 파일 접근을 위한 정보 구조체이다 .– 구조체의 내용을 지금 알 필요는 없다 .

강 C 프로그래밍

FILE *fp;

운영체제

보조 기억장치(HDD)

FILE 구조체

프로그램

FILE 구조체

파일 1파일 2

Page 19: Ch.14 파일 강c v0.6

19/65

표준 입출력

stdin, stdout, stderr 도 FILE * 이다 .사전에 정의된 입출력 스트림 구조체의 포인터이다 .미리 열려있으므로 , 입출력에 바로 사용 가능하다 .– fopen 불필요

파일 입출력 함수들 역시 표준 입출력에 사용 가능하다 .– fgets(buf, 100, stdin);

강 C 프로그래밍

Page 20: Ch.14 파일 강c v0.6

20/65

14.3 파일의 사용

강 C 프로그래밍

Page 21: Ch.14 파일 강c v0.6

21/65

파일 열기

FILE *fopen(const char *filename, const char *mode)– filename : 열고자 하는 파일 이름

– mode : 파일 열기 모드

– 반환값 : 지정한 파일의 FILE 구조체 포인터 ( 스트림 지시자 )

– FILE *pFile = fopen(“hporter.txt”, “r”);• hporter.txt 파일을 텍스트 파일 읽기 모드로 열기 요청

– FILE *pFile = fopen(“score.dat”, “wb”);– FILE *pFile = fopen(“data\\report.txt”, “w”);– FILE *pFile = fopen(“diary.txt”, “r+”); 강 C 프로그래밍

Page 22: Ch.14 파일 강c v0.6

22/65

파일 열기

모드

– 예 ) “r”, “rt”, “wb

반환값

– FILE 구조체 포인터

– 파일 열기에 실패시 NULL – 파일 열기 실패는 자주 일어나므로 반드시 NULL 체크를 해야

한다 . 강 C 프로그래밍

모드 의미“r” 읽기 ( 파일이 반드시 존재 )“w” 쓰기 ( 파일을 새로 생성 . 기존 파일 있으면 내용

삭제 )“a” 기존 파일에 추가하기 ( 마지막 이후에 쓰기 )추가 “ b”, “t” 이진 파일 또는 텍스트 파일 (“t” 는 생략 가능 )추가 “ +” 업데이트 가능 . 기본 동작에 추가로 업데이트를 한다 .추가 “ x” “w” 와 결합하여 , 기존 파일이 있으면 열기 실패

(C11)

Page 23: Ch.14 파일 강c v0.6

23/65

파일 열기

열기 실패

– 읽기 의 경우 파일이 없을 때 , 쓰기의 경우 파일 이름 오류 , 공간 부족

FILE *pFile;char filename[50] = “data.txt”; pFile = fopen(filename, “r”); while (pFile == NULL) { printf(“ 파일이 존재하지 않거나 오류가 있습니다 . 다른 파일 이름을 입력하세요 .\n”); scanf(“%s”, filename); pFile = fopen(filename, “r”);}

강 C 프로그래밍

Page 24: Ch.14 파일 강c v0.6

24/65

파일 열기

여러 파일을 사용할 때

– 하나의 FILE 구조체 포인터를 이용

FILE pFile;pFile = fopen(“1 번파일” , “r”);…fclose(pFile); // 1 번 파일 사용 종료pFile = fopen(“2 번파일” ,”wb”);…

– 동시에 여러 개의 파일을 이용한다면 여러 개의 FILE 구조체 포인터를 이용

FILE pFile1, pFile2, pFile3;pFile1 = fopen(“1 번파일” , “r” );pFile2 = fopen( “2 번파일” , “wb”);pFile3 = fopen( “3 번파일” , “w”);

강 C 프로그래밍

동시에 열 수 있는 파일 개수는 제한이 있다 .

Page 25: Ch.14 파일 강c v0.6

25/65

파일 입출력

int fprintf ( FILE * stream, const char * format, ... );int fscanf ( FILE * stream, const char * format, ... );

char * fgets ( char * str, int num, FILE * stream );int fputs ( const char * str, FILE * stream );

int fgetc ( FILE * stream );int fputc ( int character, FILE * stream );강 C 프로그래밍

Page 26: Ch.14 파일 강c v0.6

26/65

문자 입출력

int fgetc(FILE *stream)int fputc(int character, FILE *stream)– 하나의 문자 읽기 / 쓰기

– 읽기 / 쓰기에 성공한 크기 반환 ( 보통 1)– 실패할 수 있다 .

• FILE 의 끝에 도달 (EOF), 공간 없음 등

강 C 프로그래밍

Page 27: Ch.14 파일 강c v0.6

27/65

문자 입출력

강 C 프로그래밍

#include <stdio.h> int main ( ){ FILE * pFile; char c;  pFile = fopen ("alphabet.txt","w"); if (pFile != NULL) {  for (c = 'A' ; c <= 'Z' ; c++) fputc ( c , pFile );  fclose (pFile); } return 0;}

#include <stdio.h> int main ( ){ FILE * pFile; int c; pFile=fopen ("alphabet.txt","r");  if (pFile==NULL) perror (" 파일 열기 실패 "); else { do { c = fgetc (pFile); // 파일에서 한 문자를 가져와 if (c != EOF) // 제대로 가져왔으면 putc(c, stdin ); // 화면에 출력 } while (c != EOF); // 파일의 끝까지 반복 fclose (pFile); } // end of if return 0;} // end of main

Page 28: Ch.14 파일 강c v0.6

28/65

문자열 입출력

char * fgets ( char * str, int num, FILE * stream );int fputs ( const char * str, FILE * stream );– 행 단위 문자 입출력

– 줄 바꿈 (\n) 이 있을 때까지 읽는다 ( 아주 길 수도 있다 )– 최대 num-1 바이트를 읽는다 . 마지막 1 바이트는 \0– fgets 에서 메모리 문제가 없도록 버퍼 크기를 지정한다 .

강 C 프로그래밍

pFile = fopen ("sentence.txt" , "r"); if (pFile == NULL) perror (" 파일 열기 실패 "); else { if ( fgets (mystr , 100 , pFile) != NULL ) // 파일 가져오기에 성공하면

puts (mystr); // 화면에 출력

fclose (pFile);

Page 29: Ch.14 파일 강c v0.6

29/65

문자열 입출력 ( 형식 지정 )

int fprintf ( FILE * stream, const char * for-mat, ... );int fscanf ( FILE * stream, const char * for-mat, ... );– printf, scanf 와 같은 형식으로 사용한다 .fscanf(pFile, “%d %d”, &i, &j);

sscanf, sprintf 를 이용하여 메모리에 작업한 후 , 파일에 기록하는 방법도 있다 . – 결과물에 별도 가공이 가능하다 . fgets(str, sizeof(str), pFile);sscanf(str, “%d %d”, &i, &j);

강 C 프로그래밍

Page 30: Ch.14 파일 강c v0.6

30/65

이진 파일

파일 열기 , 닫기는 텍스트 파일과 같다 ( 모드만 다르다 ).이진 파일은 텍스트 파일과 다르다 .– 문자가 아닌 데이터도 있다 (ASCII 코드 이외의 값 )– 0 은 널문자가 아니라 , 그냥 데이터 0 이다 .– 줄바꿈은 그냥 데이터 ‘ \n’(13) 이다 .

int fread(void *buf, int size, int n, FILE *fp);int fwrite(const void *buf, int size, int n, FILE *fp); 강 C 프로그래밍

Page 31: Ch.14 파일 강c v0.6

31/65

이진 파일 읽기

int fread(void *buf, int size, int n, FILE *fp);– size 크기의 블록을 n 개만큼 이진 파일을 읽어 buf 에

저장하라 . ( size * n 바이트 )– 다음의 세 가지는 동일하다 .

• fread(buf, 10, 100, fp);• fread(buf, 100, 10, fp);• fread(buf, 1000, 1, fp);

– 반환값은 작업한 크기 (블록 수 )• 읽기 시도보다 작은 크기를 가져올 수도 있다 .(EOF)

int fwrite(const void *buf, int size, int n, FILE *fp);– 반환값은 작업한 크기 ( 불록 개수 ) – size 와 다르면 쓰기 에러

강 C 프로그래밍

Page 32: Ch.14 파일 강c v0.6

32/65

파일 닫기

int fclose(FILE *fp);– 정상실행이면 0, 문제가 있으면 EOF 반환

닫기를 꼭 해야 하나

– 동시에 열 수 있는 파일의 개수는 제한된다 .– 운영체제는 파일을 닫아야 파일 작업을 마무리한다 .– 파일을 닫아야 다른 프로세스가 그 파일에 접근할 수 있다 .

강 C 프로그래밍

Page 33: Ch.14 파일 강c v0.6

33/65

파일 위치 조정

파일은 순차 접근 메모리– 파일은 앞에서 뒤로 차례로 기록되어 있다 . – 읽기 위치를 조정할 수 있고 , 앞 부분을 건너뛰고 뒷부분을 읽을

수 있다 . int fseek (FILE *fp, logn offset, int mode);– offset 과 mode 로 지정한 위치로 읽는 위치를 이동한다 .– mode 는 SEEK_SET( 파일의 시작부터 ), SEEK_CUR( 현재 위치 ), SEEK_END( 파일의 끝 ) 중 하나 .

강 C 프로그래밍

Page 34: Ch.14 파일 강c v0.6

34/65

파일 위치 조정

FILE * pFile; pFile = fopen ( “text.txt" , "wb" ); // 텍스트 파일이지만 , 이진 모드로 기록했다 .fputs ( “Hello World." , pFile ); // 일단 문자열을 기록한다 .fseek ( pFile , 6 , SEEK_SET ); // 기록 위치를 조정한다 .fputs ( “Cprog" , pFile ); // 문자열을 추가 기록한다 .fclose ( pFile );

text.txt 파일에 Hello Cprog. 가 들어있다 .

강 C 프로그래밍

H e l l o W o r l d .0 1 2 3 4 5 6

fseek

좋은 방법은 아니다 . 불가피할 때에만 쓴다 .

Page 35: Ch.14 파일 강c v0.6

35/65

파일 위치 조정

void rewind(FILE *fp)– 읽는 위치를 처음으로 되돌린다 .– 읽기 쓰기 겸용 모드 (+) 에서 모드 전환시 이용한다 ( 읽기 후

쓰기 전환 ) int fflush(FILE *fp)– 성능 향상을 위해 버퍼링을 하는데 , 버퍼의 내용을 디스크에

강제 반영한다 .– 비정상 종료에 대비한다 .

long ftell(FILE *fp) – 읽는 위치를 반환한다 .

강 C 프로그래밍

fseek, ftell 은 long 형이다 . 파일이 2GB 보다 크다면 => fgetpos, fsetpos

Page 36: Ch.14 파일 강c v0.6

36/65

파일의 끝 , EOF

int feof ( FILE * stream );– 파일의 끝이면 True 를 , 파일의 끝이 아니면 False 를 반환

FILE * pFile; int size = 0; pFile = fopen (“document.txt","r"); if (pFile==NULL) perror ("Error opening file"); else {

else puts ("End-of-File was not reached."); fclose (pFile);

강 C 프로그래밍

while (fgetc(pFile) != EOF) { ++n; } if (feof(pFile)) { printf ("파일 크기는 %d 바이트 \n", n); }

while (!feof(pFile) ) { fgetc(pFile); ++n; }

printf ("파일 크기는 %d 바이트 \n", n); }

또는

Page 37: Ch.14 파일 강c v0.6

37/65

표준 입력 스트림의 끝

표준 입력 스트림 (stdin) 에는 EOF 가 없다 .– 끝이다 싶으면 또 입력하기 때문에 끝이 없다 .

표준 입력 스트림의 EOF 를 위한 별도의 입력을 만들었다 .– Ctrl-Z (윈도우 ), 또는 Ctrl-D ( 리눅스 )– 이 입력을 넣으면 입력 함수는 EOF 에 도달한 것으로 판단한다 .

이렇게 해서 표준 입력 스트림도 완벽한 파일 입력 스트림이 되었다 .

강 C 프로그래밍

Page 38: Ch.14 파일 강c v0.6

38/65

파일 운용

int rename ( const char * oldname, const char * newname ); // 파일 이름 변경

int remove ( const char * filename ); // 파일 삭제

주의할 점

– 이름이 적절치 않거나 , 권한 문제가 있거나 , 파일이 열려 있는 등의 실패 가능성은 얼마든지 있다 .

– 파일 이름을 알아야 삭제할 수 있다 . 와일드카드 (*) 는 사용할 수 없다 .

– 삭제한 파일은 휴지통에 없다 . 휴지통은 윈도우의 탐색기에서 삭제한 것만 저장되며 , 프로그램에서 삭제한 것은 바로 삭제된다 .

강 C 프로그래밍

파일 삭제로 남을 괴롭히지 말자 .

Page 39: Ch.14 파일 강c v0.6

39/65

14.4 파일의 이해

강 C 프로그래밍

Page 40: Ch.14 파일 강c v0.6

40/65

파일의 접근

열려 있는 파일은

– 다른 프로세스에서 삭제할 수 없거나 , ( 열려있는 파일 )– 다른 프로세스에서 읽을 수 없거나 , ( 쓰기 위해 열려있는 파일 )– 다른 프로세스에서 읽을 내용이 없다 . ( 쓰기 위해 열려 있는

파일 )

강 C 프로그래밍

운영체제

파일 1

쓰기진행중

접근 금지( 볼 수 없다 )

프로그램

Page 41: Ch.14 파일 강c v0.6

41/65

이진 파일 보기

별도의 이진 파일 편집기를 이용해야 한다 .– 이진 데이터를 보더라도 이해하기 어렵다 .– 그나마 쉽게 볼 수 있도록 해주는 도구를 설치

강 C 프로그래밍

Page 42: Ch.14 파일 강c v0.6

42/65

이진 파일 보기

// fopen

int i = 1000; // ==0x000003e8

 

fwrite(&i, 4, 1, fp);

// fclose

강 C 프로그래밍

Page 43: Ch.14 파일 강c v0.6

43/65

텍스트 파일의 이진 파일 보기

강 C 프로그래밍

이진 값으로 표시하면 텍스트로 표시하면

Page 44: Ch.14 파일 강c v0.6

44/65

텍스트 파일의 특이점

줄바꿈이 0d 0a 의 2 바이트로 저장된다 .– 운영체제의 특성이다 . (윈도우에서만 나타남 )– 실제 저장하는 크기에 비해 1 바이트 커진다 .– 텍스트 파일 열기에서만 나타난다 .– 읽으면 알아서 없어진다 .

강 C 프로그래밍

Page 45: Ch.14 파일 강c v0.6

45/65

10 진수 -16 진수 변환 팁

이진 파일 보기에서 16 진수 변환이 필요하다 .윈도우 계산기를 이용하자 .– 프로그래머용

강 C 프로그래밍

Page 46: Ch.14 파일 강c v0.6

46/65

파일의 선택 ( 텍스트 / 이진 )

i = 1000;이 값을 저장하는 두 가지 방법

– 텍스트 파일로 오픈한 후 , fputs 로 “ 1000” 저장 (4 바이트 )• 읽을 때 , fgets 로 읽은 후 , atoi 로 변환하거나 , fscanf 로 읽는다 .

– 이진 파일로 오픈한 후 , fwrite 로 1000 저장 (4 바이트 )• 읽을 때 fread 로 읽는다 .

상황에 따라 맞는 방식으로 저장한다 .

강 C 프로그래밍

Page 47: Ch.14 파일 강c v0.6

47/65

파일의 선택 ( 텍스트 / 이진 )

강 C 프로그래밍

FILE *pFile;int i = 123456, j;pFile = fopen(“data.txt”, “w”);fprintf(pFile, “%d”, i);fclose(pFile); pFile = fopen(“data.txt”, “r”);fscanf(pFile, “%d”, &j );fclose(pFile);

FILE *pFile;int i = 123456, j;pFile = fopen(“data.dat”, “wb”);fwrite(&i, 4, 1, pFile);fclose(pFile); pFile = fopen(“data.dat”, “rb”);fread(&j, 4, 1, pFile);fclose(pFile);

“123456” (6 바이트 )

파일의 크기가 크다 .데이터 파일을 쉽게 수정할 수 있다 .

40 E2 01 00 (4 바이트 )

파일의 크기가 작다 .데이터 파일을 수정하기 어렵다 .

Page 48: Ch.14 파일 강c v0.6

48/65

파일의 선택 ( 텍스트 / 이진 )

강 C 프로그래밍

struct class myclass = { "Kim", "Seoul", "010-1111-2222" }, yourclass; FILE *fp;fp = fopen("data.txt", "w");fprintf(fp, "%s\n", myclass.name);fprintf(fp, "%s\n", myclass.address);fprintf(fp, "%s\n", myclass.telephone);fclose(fp); fp = fopen("data.txt", "r");fgets(yourclass.name, 30, fp);fgets(yourclass.address, 50, fp);fgets(yourclass.telephone, 15, fp);fclose(fp);

struct class myclass = { "Kim", "Seoul", "010-1111-2222" }, yourclass; fp = fopen("data.dat", "wb");fwrite(&myclass, sizeof(struct class), 1, fp);fclose(fp); fp = fopen("data.dat", "r");fread(&yourclass, sizeof(struct class), 1, fp);fclose(fp);

파일 저장 방식은 선택의 문제이다 .

27 bytes 95 bytes

struct class { char name[30]; // 이름 char address[50]; // 주소 char telephone[15]; // 전화번호} myclass;

Page 49: Ch.14 파일 강c v0.6

49/65

파일의 선택

전반적으로

– 파일 크기가 효율적인 경우

– 처리가 단순한 경우

텍스트 파일이 좋은 경우

– 데이터가 문자열만으로 구성된 경우

– 파일을 직접 수정할 필요가 있을 때

– 다른 프로그램과 자료를 공유할 때

이진 파일이 좋은 경우

– 파일 저장의 효율이 중요한 경우

– 다른 파일과 공유하지 않는 경우 ( 데이터를 숨길 필요가 있을 때 ) 강 C 프로그래밍

Page 50: Ch.14 파일 강c v0.6

50/65

열린 파일

열려있는 파일

– 운영체제가 관리중인 파일

– 삭제가 불가능 . 허용하면 어떤 일이 생길까 ?– 운영체제는 안정적인 파일 관리를 위해 노력한다 .

강 C 프로그래밍

Page 51: Ch.14 파일 강c v0.6

51/65

파일 처리의 성능

파일 저장 장치 ( 보조 기억장치 ) 는 느리다 .– 운영체제는 나름 노력한다 . 그래도 느리다 .– 개발자가 빠르게 사용하기 위한 노력을 해야 한다 .

성능 향상 방법

– 파일 입출력은 비교적 크게 한다 .• 일단 메모리에서 필요한 작업을 한 후 , 파일 입출력을 한다 .

– 파일 입출력은 한꺼번에 , 순차적으로 한다 .– 데이터의 양이 많으면 이진 파일이 낫다 .– 파일 크기가 중요할 때에는 압축을 이용한다 .– 파일 여러 개를 쓰는 것보다 하나를 쓰는 것이 좋다 .

강 C 프로그래밍

Page 52: Ch.14 파일 강c v0.6

52/65

파일 설계

텍스트 파일의 설계

강 C 프로그래밍

Kim808090

name = KimKscore = 80Escore = 80Mscore = 90

방식 1 방식 2

순서가 반드시 유지되어야 한다 .

순서를 알아야 읽기가 가능하다 .

데이터 파일을 수정할 때 조심해야 한다 .

간단한 프로그램을 작성할 때 용이하다 .

데이터의 수정이 용이하다 .순서가 유지될 필요도 없다 .

사용자의 편의를 위해 개발자가 많은 일을 해야 한다 .

범용적이므로 이 방식을 많이 쓴다 .

Page 53: Ch.14 파일 강c v0.6

53/65

파일의 설계

텍스트 파일

– 선택한 양식이 있는지 정한다 .• name = value 와 같은 형식

– 기본적으로 문장 단위이다 .– 텍스트 파일은 엄격한 규격의 설계를 하지 않는 것이 좋다 .

• 융통성이 필요하다 .

강 C 프로그래밍

Page 54: Ch.14 파일 강c v0.6

54/65

파일의 설계

강 C 프로그래밍

1000 1300 1800

포인터는 저장해봐야 의미가 없다 .

1000 2 1300 3 1800 0

변환한다 .

1 2 3

인덱스를 만들고

Page 55: Ch.14 파일 강c v0.6

55/65

파일의 설계

이진 파일

– 데이터 파일은 대부분 이진 파일이다 .– 파일의 저장 순서대로 파일을 읽어야 한다 .– 파일의 저장 구조를 알려주지 않으면 파일의 내용을 알 수 없다 .– 다른 프로그램과 공유하려면 파일의 구조를 잘 설명해 주어야

한다 .• mp3, bmp, png, jpg, wav 등

강 C 프로그래밍

Page 56: Ch.14 파일 강c v0.6

56/65

파일의 설계

강 C 프로그래밍

순서 이름 크기 ( 자료형 ) 용도

1 name 10 (char) 학생의 이름

2 kor 1 (char) 국어 점수

3 eng 1 (char) 영어 점수

4 mat 1 (char) 수학 점수

5 ave 4 (float) 평균

6 rank 4 (int) 순위

name (10) kor(1) eng(1)

mat(1) ave (3)

ave(1) rank(4)

16 바이트

16 바이트 단위로 설계 내용을 보여준다 .

Page 57: Ch.14 파일 강c v0.6

57/65

파일의 설계

별도의 파일 입출력 구조체를 이용한다 .– 저장 / 읽기를 할 데이터들을 구조체에 모아둔다 .– 구조체 단위로 입출력을 한다 . – 파일 구조를 유지시키고 , 실수를 예방한다 .

강 C 프로그래밍

// 저장하기 FileBlock.year = thisyear;FileBlock.month = thismonth;FileBlock.day = today;FileBlock.price = todayprice; fwrite(&FileBlock, sizeof(struct _FILEB), 1, pFile);

// 불러오기fread(&FileBlock, sizeof(struct _FILEB), 1, pFile); thisyear = FileBlock.year;thismonth = FileBlock.month;today = FileBlock.day;todayptice = FileBlock.price;

Page 58: Ch.14 파일 강c v0.6

58/65

알려진 양식의 파일 사용

bmp, jpg, png, mp4, avi, mp3, zip– 파일 양식이 공개되어 있다 .– 양식만 유지하면 내 프로그램에서 활용 가능하다 .– 다만 , 양식이 어렵다 .

강 C 프로그래밍

Page 59: Ch.14 파일 강c v0.6

59/65

파일 사용시 주의할 점

원본 데이터는 잘 보관하라 .– 파일 읽기 , 쓰기를 반복하다 원본 데이터를 날릴 수 있다 .

하나의 파일에 파일 읽기와 쓰기를 하지 마라 .– 쓰기 과정은 파일의 내용을 모두 없앨 가능성이 있다 .

파일 입출력 부분은 별도의 함수로 구분하라

– 데이터 쓰기 , 읽기는 프로그램의 다른 부분과 구분된다 .– 파일 입출력은 한꺼번에 진행한다 . 프로그램 진행 중에 부분적

읽기 , 쓰기를 하지 마라 .

프로그램이 비정상 종료될 수 있다 .– 파일 열기만 하고 쓰기 , 닫기를 못할 수도 있다 .

강 C 프로그래밍

Page 60: Ch.14 파일 강c v0.6

60/65

그 외

이 장에서 설명되지 않은 것들

– 폴더 만들기 , 삭제하기

– 파일 목록 보기

설명하지 않은 이유

– 운영체제마다 함수가 다르다 .– 표준 함수가 아니다 . – 따라서 각 운영체제마다 함수를 조사하여 적용해야 한다 .

강 C 프로그래밍

Page 61: Ch.14 파일 강c v0.6

61/65

14.5 외부 파일 사용하기

강 C 프로그래밍

Page 62: Ch.14 파일 강c v0.6

62/65

bmp 파일의 사용

bmp 파일

– 이미지 파일이면서 복잡한 압축 알고리즘이 없다 .– 보다 쉽게 접근하기 위해 흑백 bmp 파일을 사용

– 앞부분에 그림 파일의 정보는 분석해야 한다 . (검색 )– 이미지 부분만 읽어오면 그림을 표시할 수 있다 .

강 C 프로그래밍

Page 63: Ch.14 파일 강c v0.6

63/65

사전 파일 읽기

영어 퍼즐 게임

– 많은 단어가 포함된 사전이 필요

– 사전 파일 ( 올바른 단어가 많이 있는 ) 을 사용

– 사전 파일의 양식대로 단어를 읽어온다 .– 텍스트 파일로 구성되어 있으면 더 편리하다 .

강 C 프로그래밍

Page 64: Ch.14 파일 강c v0.6

64/65

엑셀 데이터를 읽어오기

CSV– comma separated value ( 데이터를 , 로 구분함 )– 엑셀 데이터를 텍스트 파일로 저장하는 방식

CSV 파일에서 데이터를 추출

– 한 행을 읽은 후 (fgets), ‘,’ 로 구분된 데이터 부분을 추출한다 . (strtok)

강 C 프로그래밍

Page 65: Ch.14 파일 강c v0.6

65/65

ZIP 파일

압축 파일

– 압축 알고리즘을 이용해 작은 크기의 파일로 만든 것

– “압축하지 않음”을 선택할 수도 있다 .– 파일 목록과 내용이 하나의 파일에 들어있다 .

과제

– “압축하지 않음”을 선택한 ZIP 파일에 포함된 파일을 원래 상태로 풀어놓는다 .

강 C 프로그래밍

ZIP파일

1파일

2파일

3파일

1파일

2파일

3