Ch.14 파일 강c v0.6
Transcript of Ch.14 파일 강c v0.6
1/65
14. 파일
강 C 프로그래밍
2/65
14.1 main 함수와 인자
강 C 프로그래밍
3/65
명령 인수
지금까지의 main 함수
int main (void) { }C:\> Program.exe ↲
프로그램 실행 시 인수를 넣어줄 수 있다 .– 함수 호출시 인수 전달과 같이 프로그램 실행에 인수를 넣는다 .C:\> Program.exe param
강 C 프로그래밍
프로그램에 “ param” 이라는 문자열을 전달
4/65
명령 인수
강 C 프로그래밍
Program B 를 실행 (data 를 전달함 )
int main( char *data ){ . . .
}
Program A Program B
프로그램 호출
Program A 를 실행 (data 를 전달함 )
int main( char *data ){ . . .
}
명령창 (탐색기 ) Program A
프로그램 호출
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 프로그래밍
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 프로그래밍
7/65
Visual Studio 의 활용
Visual Studio IDE 에서 명령 인수 지정 방법
강 C 프로그래밍
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 파일을 가지고 실행
파일의 이름만 전달한 것일 뿐 , 프로그램 동작은 개발자가 직접 해주어야 한다 .
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 프로그래밍
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 프로그래밍
주로 리눅스에서 사용
11/65
14.2 파일의 개념
강 C 프로그래밍
12/65
메모리
메모리
– 주메모리 : 속도가 빠르다 . 가격이 비싸다 . 휘발성 . 프로그램 실행에 필수적
– 보조메모리 : 속도가 느리다 . 가격이 싸다 . 영구적 . – 영구적인 자료 보관 , 대용량의 데이터는 보조메모리 이용
파일
– 이름 + 확장자 , 날짜 , 크기
– 폴더
강 C 프로그래밍
13/65
C 언어의 파일
파일의 종류
– 텍스트 파일 – 문자로 구성된 파일 . 문자열을 저장한 것
• 확장자가 .txt, .log, .ini, .xml 로 구성된다 .• 문서 편집기 , 메모장을 통하여 내용을 쉽게 확인할 수 있다 .
– 이진 (binary) 파일 – 각종 숫자를 포함한 이진 데이터를 저장한 것 ( 포괄적 )• mp3, jpg, avi, .exe 를 비롯한 대부분의 파일
강 C 프로그래밍
14/65
프로그램이 파일을 지원하면
강 C 프로그래밍
Program Program실행 종료 실행
시간변수값 저장 변수값 읽기
연속성
Program실행
데이터 읽기
Program실행
데이터 읽기
Program실행
데이터 읽기
① 프로그램 실행의 연속성
② 번거로운 데이터 입력 자동화
③ 데이터의 이동
Program A
데이터 파일
Program B
데이터 파일이동
프로그램이 한층강력해진다 .
15/65
C 에서 파일 생성과 기록
파일 열기
– 파일 이름과 목적 ( 읽기 또는 쓰기 ) 지정
– 파일의 스트림 지시자 ( 핸들 ) 를 얻는다 .
파일 읽기 / 쓰기
– 용도에 맞도록 파일의 내용을 읽어 메모리로 가져오거나 , 메모리의 내용을 파일에 기록한다 .
파일 닫기
– 파일 작업이 완료되면 파일을 마무리한다 . – 파일을 닫으면 새로 열기 전까지 파일 접근을 할 수 없다 .
강 C 프로그래밍
16/65
파일의 이름
파일 이름– 저장될 데이터의 특성을 잘 나타낼 수 있는 이름을 선택
– 문자열이므로 , “ ” 사이에 기록한다 . – 알파벳 , 숫자 , 일부 기호 사용 가능 . 대소문자 구별 없음 .– \, /, *, *, ?, “, <, >, | 는 사용 불가 ( 운영체제마다 다르다 )
폴더– 폴더와 폴더 , 폴더와 파일 이름 사이에 ‘ \’ 또는 ‘ /’ 을 붙여야
한다 ( 운영체제 지시 사항 . 리눅스의 경우 ‘ /’ )– “ ” 안에 \ 를 쓸 때에는 “ \\” 처럼 두 개를 써야 한다 (
이스케이프시퀀스 ).– 폴더 지정이 없으면 현재 폴더 ( 실행파일이 있는 곳 ) 이며 , Vis-
ual Studio 실행시 소스코드가 있는 폴더이다 .
강 C 프로그래밍
17/65
읽기 쓰기 모드
파일을 열 때 모드를 지정해야 한다 .보통 읽기 또는 쓰기 중 하나를 지정한다 .– 두 가지를 모두 하더라도 , 읽기를 모두 한 후 , 쓰기를 한다 .– 두 가지 일을 섞어서 하면 관리가 어렵고 성능도 저하된다 .
읽기를 하려면 파일이 존재해야 한다 .– 없으면 에러
쓰기를 하려면 파일 존재가 무관하다 .– 있으면 기존 파일 삭제 (따라서 주의 )
강 C 프로그래밍
18/65
파일과 운영체제
파일 관리는 운영체제의 역할이다 ( 메모리처럼 ).FILE 구조체는 파일 접근을 위한 정보 구조체이다 .– 구조체의 내용을 지금 알 필요는 없다 .
강 C 프로그래밍
FILE *fp;
운영체제
보조 기억장치(HDD)
FILE 구조체
프로그램
FILE 구조체
파일 1파일 2
19/65
표준 입출력
stdin, stdout, stderr 도 FILE * 이다 .사전에 정의된 입출력 스트림 구조체의 포인터이다 .미리 열려있으므로 , 입출력에 바로 사용 가능하다 .– fopen 불필요
파일 입출력 함수들 역시 표준 입출력에 사용 가능하다 .– fgets(buf, 100, stdin);
강 C 프로그래밍
20/65
14.3 파일의 사용
강 C 프로그래밍
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 프로그래밍
22/65
파일 열기
모드
– 예 ) “r”, “rt”, “wb
반환값
– FILE 구조체 포인터
– 파일 열기에 실패시 NULL – 파일 열기 실패는 자주 일어나므로 반드시 NULL 체크를 해야
한다 . 강 C 프로그래밍
모드 의미“r” 읽기 ( 파일이 반드시 존재 )“w” 쓰기 ( 파일을 새로 생성 . 기존 파일 있으면 내용
삭제 )“a” 기존 파일에 추가하기 ( 마지막 이후에 쓰기 )추가 “ b”, “t” 이진 파일 또는 텍스트 파일 (“t” 는 생략 가능 )추가 “ +” 업데이트 가능 . 기본 동작에 추가로 업데이트를 한다 .추가 “ x” “w” 와 결합하여 , 기존 파일이 있으면 열기 실패
(C11)
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 프로그래밍
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 프로그래밍
동시에 열 수 있는 파일 개수는 제한이 있다 .
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 프로그래밍
26/65
문자 입출력
int fgetc(FILE *stream)int fputc(int character, FILE *stream)– 하나의 문자 읽기 / 쓰기
– 읽기 / 쓰기에 성공한 크기 반환 ( 보통 1)– 실패할 수 있다 .
• FILE 의 끝에 도달 (EOF), 공간 없음 등
강 C 프로그래밍
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
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);
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 프로그래밍
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 프로그래밍
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 프로그래밍
32/65
파일 닫기
int fclose(FILE *fp);– 정상실행이면 0, 문제가 있으면 EOF 반환
닫기를 꼭 해야 하나
– 동시에 열 수 있는 파일의 개수는 제한된다 .– 운영체제는 파일을 닫아야 파일 작업을 마무리한다 .– 파일을 닫아야 다른 프로세스가 그 파일에 접근할 수 있다 .
강 C 프로그래밍
33/65
파일 위치 조정
파일은 순차 접근 메모리– 파일은 앞에서 뒤로 차례로 기록되어 있다 . – 읽기 위치를 조정할 수 있고 , 앞 부분을 건너뛰고 뒷부분을 읽을
수 있다 . int fseek (FILE *fp, logn offset, int mode);– offset 과 mode 로 지정한 위치로 읽는 위치를 이동한다 .– mode 는 SEEK_SET( 파일의 시작부터 ), SEEK_CUR( 현재 위치 ), SEEK_END( 파일의 끝 ) 중 하나 .
강 C 프로그래밍
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
좋은 방법은 아니다 . 불가피할 때에만 쓴다 .
35/65
파일 위치 조정
void rewind(FILE *fp)– 읽는 위치를 처음으로 되돌린다 .– 읽기 쓰기 겸용 모드 (+) 에서 모드 전환시 이용한다 ( 읽기 후
쓰기 전환 ) int fflush(FILE *fp)– 성능 향상을 위해 버퍼링을 하는데 , 버퍼의 내용을 디스크에
강제 반영한다 .– 비정상 종료에 대비한다 .
long ftell(FILE *fp) – 읽는 위치를 반환한다 .
강 C 프로그래밍
fseek, ftell 은 long 형이다 . 파일이 2GB 보다 크다면 => fgetpos, fsetpos
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); }
또는
37/65
표준 입력 스트림의 끝
표준 입력 스트림 (stdin) 에는 EOF 가 없다 .– 끝이다 싶으면 또 입력하기 때문에 끝이 없다 .
표준 입력 스트림의 EOF 를 위한 별도의 입력을 만들었다 .– Ctrl-Z (윈도우 ), 또는 Ctrl-D ( 리눅스 )– 이 입력을 넣으면 입력 함수는 EOF 에 도달한 것으로 판단한다 .
이렇게 해서 표준 입력 스트림도 완벽한 파일 입력 스트림이 되었다 .
강 C 프로그래밍
38/65
파일 운용
int rename ( const char * oldname, const char * newname ); // 파일 이름 변경
int remove ( const char * filename ); // 파일 삭제
주의할 점
– 이름이 적절치 않거나 , 권한 문제가 있거나 , 파일이 열려 있는 등의 실패 가능성은 얼마든지 있다 .
– 파일 이름을 알아야 삭제할 수 있다 . 와일드카드 (*) 는 사용할 수 없다 .
– 삭제한 파일은 휴지통에 없다 . 휴지통은 윈도우의 탐색기에서 삭제한 것만 저장되며 , 프로그램에서 삭제한 것은 바로 삭제된다 .
강 C 프로그래밍
파일 삭제로 남을 괴롭히지 말자 .
39/65
14.4 파일의 이해
강 C 프로그래밍
40/65
파일의 접근
열려 있는 파일은
– 다른 프로세스에서 삭제할 수 없거나 , ( 열려있는 파일 )– 다른 프로세스에서 읽을 수 없거나 , ( 쓰기 위해 열려있는 파일 )– 다른 프로세스에서 읽을 내용이 없다 . ( 쓰기 위해 열려 있는
파일 )
강 C 프로그래밍
운영체제
파일 1
쓰기진행중
접근 금지( 볼 수 없다 )
프로그램
41/65
이진 파일 보기
별도의 이진 파일 편집기를 이용해야 한다 .– 이진 데이터를 보더라도 이해하기 어렵다 .– 그나마 쉽게 볼 수 있도록 해주는 도구를 설치
강 C 프로그래밍
42/65
이진 파일 보기
// fopen
int i = 1000; // ==0x000003e8
fwrite(&i, 4, 1, fp);
// fclose
강 C 프로그래밍
43/65
텍스트 파일의 이진 파일 보기
강 C 프로그래밍
이진 값으로 표시하면 텍스트로 표시하면
44/65
텍스트 파일의 특이점
줄바꿈이 0d 0a 의 2 바이트로 저장된다 .– 운영체제의 특성이다 . (윈도우에서만 나타남 )– 실제 저장하는 크기에 비해 1 바이트 커진다 .– 텍스트 파일 열기에서만 나타난다 .– 읽으면 알아서 없어진다 .
강 C 프로그래밍
45/65
10 진수 -16 진수 변환 팁
이진 파일 보기에서 16 진수 변환이 필요하다 .윈도우 계산기를 이용하자 .– 프로그래머용
강 C 프로그래밍
46/65
파일의 선택 ( 텍스트 / 이진 )
i = 1000;이 값을 저장하는 두 가지 방법
– 텍스트 파일로 오픈한 후 , fputs 로 “ 1000” 저장 (4 바이트 )• 읽을 때 , fgets 로 읽은 후 , atoi 로 변환하거나 , fscanf 로 읽는다 .
– 이진 파일로 오픈한 후 , fwrite 로 1000 저장 (4 바이트 )• 읽을 때 fread 로 읽는다 .
상황에 따라 맞는 방식으로 저장한다 .
강 C 프로그래밍
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 바이트 )
파일의 크기가 작다 .데이터 파일을 수정하기 어렵다 .
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;
49/65
파일의 선택
전반적으로
– 파일 크기가 효율적인 경우
– 처리가 단순한 경우
텍스트 파일이 좋은 경우
– 데이터가 문자열만으로 구성된 경우
– 파일을 직접 수정할 필요가 있을 때
– 다른 프로그램과 자료를 공유할 때
이진 파일이 좋은 경우
– 파일 저장의 효율이 중요한 경우
– 다른 파일과 공유하지 않는 경우 ( 데이터를 숨길 필요가 있을 때 ) 강 C 프로그래밍
50/65
열린 파일
열려있는 파일
– 운영체제가 관리중인 파일
– 삭제가 불가능 . 허용하면 어떤 일이 생길까 ?– 운영체제는 안정적인 파일 관리를 위해 노력한다 .
강 C 프로그래밍
51/65
파일 처리의 성능
파일 저장 장치 ( 보조 기억장치 ) 는 느리다 .– 운영체제는 나름 노력한다 . 그래도 느리다 .– 개발자가 빠르게 사용하기 위한 노력을 해야 한다 .
성능 향상 방법
– 파일 입출력은 비교적 크게 한다 .• 일단 메모리에서 필요한 작업을 한 후 , 파일 입출력을 한다 .
– 파일 입출력은 한꺼번에 , 순차적으로 한다 .– 데이터의 양이 많으면 이진 파일이 낫다 .– 파일 크기가 중요할 때에는 압축을 이용한다 .– 파일 여러 개를 쓰는 것보다 하나를 쓰는 것이 좋다 .
강 C 프로그래밍
52/65
파일 설계
텍스트 파일의 설계
강 C 프로그래밍
Kim808090
name = KimKscore = 80Escore = 80Mscore = 90
방식 1 방식 2
순서가 반드시 유지되어야 한다 .
순서를 알아야 읽기가 가능하다 .
데이터 파일을 수정할 때 조심해야 한다 .
간단한 프로그램을 작성할 때 용이하다 .
데이터의 수정이 용이하다 .순서가 유지될 필요도 없다 .
사용자의 편의를 위해 개발자가 많은 일을 해야 한다 .
범용적이므로 이 방식을 많이 쓴다 .
53/65
파일의 설계
텍스트 파일
– 선택한 양식이 있는지 정한다 .• name = value 와 같은 형식
– 기본적으로 문장 단위이다 .– 텍스트 파일은 엄격한 규격의 설계를 하지 않는 것이 좋다 .
• 융통성이 필요하다 .
강 C 프로그래밍
54/65
파일의 설계
강 C 프로그래밍
1000 1300 1800
포인터는 저장해봐야 의미가 없다 .
1000 2 1300 3 1800 0
변환한다 .
1 2 3
인덱스를 만들고
55/65
파일의 설계
이진 파일
– 데이터 파일은 대부분 이진 파일이다 .– 파일의 저장 순서대로 파일을 읽어야 한다 .– 파일의 저장 구조를 알려주지 않으면 파일의 내용을 알 수 없다 .– 다른 프로그램과 공유하려면 파일의 구조를 잘 설명해 주어야
한다 .• mp3, bmp, png, jpg, wav 등
강 C 프로그래밍
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 바이트 단위로 설계 내용을 보여준다 .
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;
58/65
알려진 양식의 파일 사용
bmp, jpg, png, mp4, avi, mp3, zip– 파일 양식이 공개되어 있다 .– 양식만 유지하면 내 프로그램에서 활용 가능하다 .– 다만 , 양식이 어렵다 .
강 C 프로그래밍
59/65
파일 사용시 주의할 점
원본 데이터는 잘 보관하라 .– 파일 읽기 , 쓰기를 반복하다 원본 데이터를 날릴 수 있다 .
하나의 파일에 파일 읽기와 쓰기를 하지 마라 .– 쓰기 과정은 파일의 내용을 모두 없앨 가능성이 있다 .
파일 입출력 부분은 별도의 함수로 구분하라
– 데이터 쓰기 , 읽기는 프로그램의 다른 부분과 구분된다 .– 파일 입출력은 한꺼번에 진행한다 . 프로그램 진행 중에 부분적
읽기 , 쓰기를 하지 마라 .
프로그램이 비정상 종료될 수 있다 .– 파일 열기만 하고 쓰기 , 닫기를 못할 수도 있다 .
강 C 프로그래밍
60/65
그 외
이 장에서 설명되지 않은 것들
– 폴더 만들기 , 삭제하기
– 파일 목록 보기
설명하지 않은 이유
– 운영체제마다 함수가 다르다 .– 표준 함수가 아니다 . – 따라서 각 운영체제마다 함수를 조사하여 적용해야 한다 .
강 C 프로그래밍
61/65
14.5 외부 파일 사용하기
강 C 프로그래밍
62/65
bmp 파일의 사용
bmp 파일
– 이미지 파일이면서 복잡한 압축 알고리즘이 없다 .– 보다 쉽게 접근하기 위해 흑백 bmp 파일을 사용
– 앞부분에 그림 파일의 정보는 분석해야 한다 . (검색 )– 이미지 부분만 읽어오면 그림을 표시할 수 있다 .
강 C 프로그래밍
63/65
사전 파일 읽기
영어 퍼즐 게임
– 많은 단어가 포함된 사전이 필요
– 사전 파일 ( 올바른 단어가 많이 있는 ) 을 사용
– 사전 파일의 양식대로 단어를 읽어온다 .– 텍스트 파일로 구성되어 있으면 더 편리하다 .
강 C 프로그래밍
64/65
엑셀 데이터를 읽어오기
CSV– comma separated value ( 데이터를 , 로 구분함 )– 엑셀 데이터를 텍스트 파일로 저장하는 방식
CSV 파일에서 데이터를 추출
– 한 행을 읽은 후 (fgets), ‘,’ 로 구분된 데이터 부분을 추출한다 . (strtok)
강 C 프로그래밍
65/65
ZIP 파일
압축 파일
– 압축 알고리즘을 이용해 작은 크기의 파일로 만든 것
– “압축하지 않음”을 선택할 수도 있다 .– 파일 목록과 내용이 하나의 파일에 들어있다 .
과제
– “압축하지 않음”을 선택한 ZIP 파일에 포함된 파일을 원래 상태로 풀어놓는다 .
강 C 프로그래밍
ZIP파일
1파일
2파일
3파일
1파일
2파일
3