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

More Related Content

What's hot

Perl Script Document
Perl Script DocumentPerl Script Document
Perl Script Document오석 한
 
IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10hungrok
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Ji Hun Kim
 
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은jieun kim
 
Ryu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIRyu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIjieun kim
 
Linux reversing study_basic_1
Linux reversing study_basic_1Linux reversing study_basic_1
Linux reversing study_basic_1Jinkyoung Kim
 
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연Joohyun Han
 
Linux reversing study_basic_2
Linux reversing study_basic_2Linux reversing study_basic_2
Linux reversing study_basic_2Jinkyoung Kim
 
10 동기및비동기장치io
10 동기및비동기장치io10 동기및비동기장치io
10 동기및비동기장치iossuser3fb17c
 
Pwnable study basic_2
Pwnable study basic_2Pwnable study basic_2
Pwnable study basic_2Jinkyoung Kim
 
Pwnable study basic_3
Pwnable study basic_3Pwnable study basic_3
Pwnable study basic_3Jinkyoung Kim
 
Character Encoding in python
Character Encoding in pythonCharacter Encoding in python
Character Encoding in pythondaesung7kang
 
Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1Jinkyoung Kim
 
200523 서울여대 BI 코딩실무 강의 자료
200523 서울여대 BI 코딩실무 강의 자료200523 서울여대 BI 코딩실무 강의 자료
200523 서울여대 BI 코딩실무 강의 자료Joohyun Han
 
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영Tae Young Lee
 
Windows reversing study_basic_3
Windows reversing study_basic_3Windows reversing study_basic_3
Windows reversing study_basic_3Jinkyoung Kim
 
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1Jinkyoung Kim
 

What's hot (20)

Perl Script Document
Perl Script DocumentPerl Script Document
Perl Script Document
 
IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10
 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5
 
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
20150509 unix v6로 배우는 커널의 원리와 구조 3 김지은
 
Ryu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST APIRyu with OpenFlow 1.3, REST API
Ryu with OpenFlow 1.3, REST API
 
Linux reversing study_basic_1
Linux reversing study_basic_1Linux reversing study_basic_1
Linux reversing study_basic_1
 
System+os study 6
System+os study 6System+os study 6
System+os study 6
 
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연
200725 AWS 클라우드 컴퓨팅으로 배우는 생물정보학 - 덕성여대 강연
 
Linux reversing study_basic_2
Linux reversing study_basic_2Linux reversing study_basic_2
Linux reversing study_basic_2
 
10 동기및비동기장치io
10 동기및비동기장치io10 동기및비동기장치io
10 동기및비동기장치io
 
Pwnable study basic_2
Pwnable study basic_2Pwnable study basic_2
Pwnable study basic_2
 
자료구조03
자료구조03자료구조03
자료구조03
 
Pwnable study basic_3
Pwnable study basic_3Pwnable study basic_3
Pwnable study basic_3
 
Character Encoding in python
Character Encoding in pythonCharacter Encoding in python
Character Encoding in python
 
Pwnable study basic_1
Pwnable study basic_1Pwnable study basic_1
Pwnable study basic_1
 
200523 서울여대 BI 코딩실무 강의 자료
200523 서울여대 BI 코딩실무 강의 자료200523 서울여대 BI 코딩실무 강의 자료
200523 서울여대 BI 코딩실무 강의 자료
 
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
 
Windows reversing study_basic_3
Windows reversing study_basic_3Windows reversing study_basic_3
Windows reversing study_basic_3
 
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1
 
System+os study 3
System+os study 3System+os study 3
System+os study 3
 

Similar to Ch.14 파일 강c v0.6

10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스유석 남
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장SeongHyun Ahn
 
10장 문자열클래스와파일클래스
10장 문자열클래스와파일클래스10장 문자열클래스와파일클래스
10장 문자열클래스와파일클래스웅식 전
 
파이썬 파일처리 및 문자열 처리
파이썬 파일처리 및 문자열 처리 파이썬 파일처리 및 문자열 처리
파이썬 파일처리 및 문자열 처리 SeongHyun Ahn
 
Processing 5th Class: File I/O
Processing 5th Class: File I/OProcessing 5th Class: File I/O
Processing 5th Class: File I/OMinGi KYUNG
 
자료구조 Project5
자료구조 Project5자료구조 Project5
자료구조 Project5KoChungWook
 
PE File Format and Packer - Inc0gnito 2016
PE File Format and Packer - Inc0gnito 2016PE File Format and Packer - Inc0gnito 2016
PE File Format and Packer - Inc0gnito 2016Hajin Jang
 
Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)정명훈 Jerry Jeong
 
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기NAVER D2
 
파이썬 파일처리 이해하기
파이썬 파일처리 이해하기파이썬 파일처리 이해하기
파이썬 파일처리 이해하기Yong Joon Moon
 
하둡 타입과 포맷
하둡 타입과 포맷하둡 타입과 포맷
하둡 타입과 포맷진호 박
 
고급시스템프로그래밍
고급시스템프로그래밍고급시스템프로그래밍
고급시스템프로그래밍Seungbeom Shim
 
TestDFSIO
TestDFSIOTestDFSIO
TestDFSIOhhyin
 
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장Sunggon Song
 

Similar to Ch.14 파일 강c v0.6 (20)

shell and process
shell and processshell and process
shell and process
 
10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스10장 문자열 클래스와 파일 클래스
10장 문자열 클래스와 파일 클래스
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장
 
10장 문자열클래스와파일클래스
10장 문자열클래스와파일클래스10장 문자열클래스와파일클래스
10장 문자열클래스와파일클래스
 
파이선 실전공략-1
파이선 실전공략-1파이선 실전공략-1
파이선 실전공략-1
 
Jdk 7 3-nio2
Jdk 7 3-nio2Jdk 7 3-nio2
Jdk 7 3-nio2
 
파이썬 파일처리 및 문자열 처리
파이썬 파일처리 및 문자열 처리 파이썬 파일처리 및 문자열 처리
파이썬 파일처리 및 문자열 처리
 
Linux tutorial
Linux tutorialLinux tutorial
Linux tutorial
 
Processing 5th Class: File I/O
Processing 5th Class: File I/OProcessing 5th Class: File I/O
Processing 5th Class: File I/O
 
linux1
linux1linux1
linux1
 
자료구조 Project5
자료구조 Project5자료구조 Project5
자료구조 Project5
 
PE File Format and Packer - Inc0gnito 2016
PE File Format and Packer - Inc0gnito 2016PE File Format and Packer - Inc0gnito 2016
PE File Format and Packer - Inc0gnito 2016
 
Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)
 
Apache avro
Apache avroApache avro
Apache avro
 
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기
제5회 D2 CAMPUS SEMINAR - Go gopher 길들이기
 
파이썬 파일처리 이해하기
파이썬 파일처리 이해하기파이썬 파일처리 이해하기
파이썬 파일처리 이해하기
 
하둡 타입과 포맷
하둡 타입과 포맷하둡 타입과 포맷
하둡 타입과 포맷
 
고급시스템프로그래밍
고급시스템프로그래밍고급시스템프로그래밍
고급시스템프로그래밍
 
TestDFSIO
TestDFSIOTestDFSIO
TestDFSIO
 
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
 

Ch.14 파일 강c v0.6

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

Editor's Notes

  1. 2
  2. 11
  3. 20
  4. 39
  5. 61