1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 프리미엄 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
***************************< 캠퍼스 C 강좌 >******************************
[제목] :
[코드] : campusc1-028 (초급)
[교재] : CAMPUS C (초급, Third edition) [출판사 : 책과스승]
[알림] :이 파일은 "캠퍼스 C"에서 모든 분께 공개한 "초급 강좌"입니다.
이 [알림]의 내용을 지우지 않는다면 누구에게나 임의로 복사해 줄 수
있습니다. 그러나 이 강좌 내용에 대한 저작권은 "캠퍼스 C"에 있습니다.
[연락처] : 605-8662 (서울) ("캠퍼스 C", 도서출판 "책과 스승")
천리안 : go campusc
나우콤 : go lcampc
하이텔 ID : campusc
****************************<< 목 차 >>************************************
<1> 화일에 관하여
1> 들어가며
2> 파일의 종류
3> 파일의 개념, 크기
4> 텍스트 파일의 구조 알아 보기
5> C 로 텍스트 파일을 만들어 보자.
6> 프린터로 출력
7> 화일의 입출력
**************************< 내용 시작 >********************************
1> 들어 가며
-----------------------------------------------------------------------
어떤 언어든지 파일을 다루는 부분은 뒷 부분에 나온다. 그건 내용이 어
느 정도 어렵다는 뜻이기도 하고 또 기본 내용을 많이 알아야 한다는걸 의미
하는 것이다.
그러나 실용적인 프로그램을 짜기 위해서는 "파일"을 취급하는 것
이 기본이 되야 한다. 이 강좌는 어느덧 끝나가지만 우리는 이제 부터 새로
운 차원에서의 "기본"을 새로 시작 해야 하는 것이다.
그리고 파일에 대한 내용도 자세하게 다룰려면 한이 없는 것이지만,
우리는 여태까지 해 오던 방법대로 "실용적인 면"에 치중하여 학습을 하도록
하자.
-----------------------------------------------------------------------
2> 파일의 종류
-----------------------------------------------------------------------
우리는 이미 파일이 무엇인지 안다. 이 강좌를 듣는 사람 중에 디스켓에
파일을 복사 한번 안 해본 사람은 없을테니 말이다.
아시다시피 c:\> dir 을 치면 아래같이 쭈루룩 나오는 것들이 파일
이름 들이다.
CONFIG EXE 22504 09-13-92 1:00p <-- 실행 파일
CC2 COM 4594 02-24-94 4:00p <-- 실행 파일
MY BAT 94 02-24-94 4:00p <-- 실행 파일(Text.file)
UNTITLED TXT 4 02-22-94 10:45p <-- 아래 전부 DATA 파일
KEYWORD ASV 4126 03-01-94 12:46a
A BUF 6422 02-24-94 4:44p
GUIDE1 LEC 1234 02-23-94 2:31p
USER HFT 132 03-01-94 11:40p
파일의 종류를 한번 구분해 보면, 크게
---------------------------------
1. 실행 파일
2. 데이타 파일 (실행 파일 아닌것)
---------------------------------
으로 구분해 볼 수 있을 것이다.
첫번째 실행 파일은 위 함수명 에서 보다시피,
1. xxx.exe
2. xxx.com
3. xxx.bat
라고 확장자가 붙은 것 이라고 얘기한 적이 있다. 그리고 나머지 파일들은
전부 "데이타 파일" 이라고 할 수 있다. 따라서 확장자의 이름만 보면 쉽게
구분할 수 있다.
그리고 또다른 분류로는
------------------------------
1. text file (텍스트 파일)
2. binary file (이진 파일)
------------------------------
로 나눠 볼수 있는데, 이 구분도 type등의 명령어로 쉽게 구분해 볼 수 있다
고 했다.(공개 강좌 참조)
이와 같이 하나의 파일은 여러가지로 분류 될 수 있겠지만, 우리는
이제부터 가장 쉽게 읽어 볼 수 있는 "text의 데이타 파일"을 알아 보기로
하자.
-----------------------------------------------------------------------
3> 파일의 개념, 크기
-----------------------------------------------------------------------
파일이란 용어는 원래 서류뭉치 따위를 묶어 놓은 것을 얘기 하는
것이다. 그러나 이 개념은 컴퓨터에서 얘기하는 파일과는 형태가 조금 다르
다.
조금 더 정확한 개념은 종이를 여러장 묶은게 아니고 옛날 우리나라
선비 들이 쓰던 "두루마리 편지" 같은 것이다.
즉 처음과 끝은 분명히 있지만, 중간에 페이지를 나눈다거나 하는
잡다한 것이 없고 오로지 글자들만 연속되서 있는 형태 이다.
그리고 "파일의 크기" 는 "두루말이 편지"에 담겨진 글자의 갯수를
말하는데, 여기서도 우리는 철저하게 "바이트"의 개념을 따져야 한다. 즉
------------------------------------------------
키보드의 특수기호, 영어 --> 1 바이트(크기 1)
한글, 한문 --> 2 바이트(크기 2)
------------------------------------------------
이 크기는 영문에서는 각각 ASCII 코드를, 그리고 한글에서는 KS 코드(혹은
KSSM 코드)를 따라 결정 되는 것이고 이 완전한 코드는 우리 교재에 나와 있
다.
-----------------------------------------------------------------------
4> 텍스트 파일의 구조 알아 보기
-----------------------------------------------------------------------
파일에 관한 많은 내용을 공부 하기전에, 우리는 직접 파일을 만들
고 이용해 봄으로서 학습의 효과를 높여 보기로 하자.
파일을 만들 수 있는 프로그램이 우리가 잘 아는 에디터, 혹은 워드
프로세서라는 것이다. 지금은 구시대의 유물이 되버렸지만 "워드 스타" 라는
것이 있었다. 이것은 아주 유명했던 것이기 때문에 요즘 워드프로세서 도 이
사용법을 따르고 있는 것이 많다. 이른바 "wordstar like" 라는 것인데, 여
러분이 이 강좌를 읽고 있을 "아래 한글"도 그렇고, 또 컴파일 할 때 자주
쓰는 "터보 씨 에디터"도 마찬가지 이다. 여러분들이 이 두가지를 쓰다보면
비슷한 사용법이 많다는 것을 느낄 때가 왕왕 있을 것이다.
이 워드스타가 천하를 평정해 주는 바람에 우리는 여러가지 에디터
를 쓰더라도 별로 (사용법이 비슷하기 때문에) 불편함을 못 느끼는 수가 많
은 것이다.
여담으로, 모뎀 세계에서도 비슷한 일이 있는데, 왕년에 미국의 "헤
이즈(hayes)" 라는 모뎀이 역시 세계를 주름 잡아서 지금도 많은 모뎀 회사
들이 "헤이즈 호환(compatible)"을 강조 하고 있는 것을 볼 수 있을 것이다.
지금 여러분이 "이야기" 따위에서 통신을 하려면 제일 처음에 AT 로 시작 되
는 명령어를 많이 볼 수 있는데 이 것이 "헤이즈 모뎀의 명령어" 인 것이다.
본론에 들어가서 이제부터 우리는 "아래 한글" 과 "터보 씨 에디터"
두개를 이용하여 파일을 만들어 보자. 먼저 터보 C 에디터에 들어가서 아래
와 같이 파일을 하나 만든다.
1. 내용은 a 한 글자만 친다.(리턴도 치지 말고)
2. 그리고 저장하고 빠져 나온다
3. 저장할 파일 이름은 tc.doc 라고 하자
그럼 tc.doc 파일의 크기는 계산상 1 이 되야 한다.(영문 한글자는
1 바이트 이므로).이제 dir로 크기를 확인해 보자.
그런데 파일 크기는 예상 외로 2 이다. 이게 정상 인데, 에디터로
만든 모든 데이타 파일의 끝에는 항상 "파일의 끝"이라는 의미로 0x1A라는
값을 넣어 둔다. 그러니까 이 값은 터보 C 에디터가 자기 맘대로 넣은 값이
다. 그리고 왜 하필 0x1A 인가 하면, 텍스트 파일은 이런 형태를 가져야 한
다고 이미 약속을 했기 때문이다.
0x1A 를 입력하는 방법은 ^z 을 누르는 것 인데,[Control Key]와
[Z] 키를 같이 누르라는 뜻이다. 하이텔을 쓰시는 분들은 이걸 잘 알것이다.
"편지 쓰기"작성이 끝나면 꼭 ^Z을 치라고 하이텔에서 요구 한다. 이제부터
는 그 의미를 완전히 이해하고 있어야 한다.
이에 비해 천리안에서는 편지 작성이 끝나면 "."(마침표)를 치라고
요구하는데 거기서는 특별한 파일 형태를 쓰느냐 하면 하면 그렇지는 않을것
이고, 아마 "."을 ^Z 으로 프로그램 내에서 바꿔서 대신 넣어 줄것이다.
이것은 노련한 프로그래머가 사용자들을 편리하게 해 주려는 배려인
것으로 짐작이 된다. 즉 손가락을 비비 꽈야되는 ^z 대신, 의미도 명료하게
마침표 "." 하나만 치라고 고쳐 준것이다.
이렇게 고치는 작업을 하려면 당연히 프로그래머의 일이 약간 더 복
잡해 지겠지만, 프로그래머는 당연히 이런 일을 해야 한다.
이런 문제를 "User interface" 문제라고 하는데, 프로그램이 아무리
훌륭하더라도 사람이 쓰기 불편하면 그것은 결코 좋은 프로그램이 아니다.
게다가 기능이라도 좋으면 다행인데 십중팔구 그런 프로그램은 기능도 떨어
진다. 좌우간 프로그래머를 잘못 만나면 쓰는사람(user)가 고생하는 법이다.
<문제> 터보 C에서 "abc"세 글자를 치고 빠져나오면 크기는 ?
이제 하나더 생각 할 문제가 있는데 그것이 리턴키(Enter Key) 이
다. 원래는 리턴키를 누르면 ASCII code의 0x0d 를 발생 시킨다(표 참조).
그런데 터보C 에디터가 또 자동으로 넣어 주는 것이 있는데 그 글자
가 0x0a 이다. 표를 보면 뜻은 Line Feed(한줄 위로 넘김) 이다. 여러분들
은 이 글자를 프린터에서 많이 봤을 것이다. 보통 줄여서 " LF" 라고 쓰는데
이 글자가 하는 기능은 "한줄을 위로 넘기는 것"이다.
이렇게 넣어주는 이유는 텍스트 화일의 형태를 맞춰 주기 위한 것이
다. 즉 텍스트 파일의 형태는 아래와 같아야 한다.
------------------------------------------------
1.라인의 끝(EOL)에는 0x0d(CR) , 0x0a(LF)를 첨가
2.파일의 끝(EOF)에는 0x1a( ^Z)을 첨가
------------------------------------------------
이제 다음과 같이 파일을 만들자.
1. abc를 치고,
2.리턴키를 치고 파일을 저장한다.
3. 이름은 tc2.doc 로 하자.
이 크기는 총 6 바이트 이다. ( abc + 0x0d + 0x0a + 0x1a)
그럼 실제로 파일의 이런 구조를 보기 위해서 debug를 이용해 보자.
이 파일은 아마 전부 갖고 있을것 이다. 보통 DOS 디렉토리 밑에 있으니까
다음과 같이 치자.
c:\> debug tc2.doc (enter)
- ? 를 치자 --> 나온 글자들이 debug 의 명령어 이다
- d 를 치자 --> dump 명령어
그러면 맨윗줄 처음 부터 ( abc + 0x0d + 0x0a + 0x1a) 가 있는게 보일 것이
다.그 글자뒤에도 복잡한 글자들이 연달아 있지만 "파일의 끝" 이라는 글자
0x1a 때문에 그다음은 파일 내용과는 상관 없다.
-q 를 치자 --> 끝내기
<숙제> 아래 한글에서도 위에서 한것과 똑같은 과정을 반복해보세요. 단 저
장할때 [새이름으로] [아스키 파일][상용조합]으로 하세요 이게 순수한 텍스
트 파일을 만드는 방법이고 "아래 한글" 타입으로 저장하면 자기들이 맘대로
써넣는 글자가 많아서 지금은 분석하기 어려울겁니다. 그리고 터보 C 에디터
와 비교해서 어떤 차이가 있는지 비교 하세요.
텍스트 파일의 구조는 위와 같이 간단하기 때문에 위와 같은 방법이
면 파일의 내용을 알아 보는데 충분하다.이런식으로 파일의 실체를 손바닥
보듯하면 C 에서 파일을 다루는 작업은 아주 간단해 지는 것이다.
-----------------------------------------------------------------------
5> C 로 텍스트 파일을 만들어 보자.
-----------------------------------------------------------------------
참고로 아래 한글에서는 a 한글자만 치고 enter 키를 안 쳐도 자기
맘대로 0x0d와 0x0a 두글자를 넣는다. 이건 이 프로그램의 특성일 뿐이고 텍
스트 파일의 규격을 벗어나는 것은 아니므로, 단순히 그렇다는 사실만 기억
하자.
이제 C에서 만드는 파일과 비교를 위해서 다시 터보 C 에디터에 들
어가서 파일을 하나 만들자.
1. 내용은 abc 세 글자만 치세요(리턴도 치지 말고)
2. 그리고 저장하고 빠져 나오세요
3. 저장할 파일 이름은 my.doc 라고 합시다
그럼 my.doc는 크기가 4 바이트 일 것 이다. 그럼 이제 본론으로 들어가서
C 에서는 위와 똑같은 파일을 만들려면 어떻게 하는지 살펴 보자.
/*----------------------------------*/
#include <stdio.h>
FILE *xxx;
main()
{
xxx = fopen("my2.doc","wt"); <-- (요기 1)
fputc('a' , xxx); <-- (요기 2)
fputc('b' , xxx);
fputc('c' , xxx);
fputc(0x1a, xxx);
fclose(xxx); <-- (요기 3)
}
/*--------------------------*/
위에서 처음 나온 함수가 3개 있다(요기). 파일에 관련된 함수 이름
들은 f...()로 시작 되는게 많은데 짐작 하다시피 file의 첫글자를 의미한
다. 따라서 이름으로 기능을 짐작 하기가 쉬울 것이다.
[378쪽]) 의 <입 출력 함수> 란에 f...()로 시작 되는 이름들을 보자.
우리는 이미 getch(), putch(), printf(), scanf() 따위의 입출력 함수 이름을
많이 알고 있는데, 거의가 다 똑같은 이름 앞에 'f' 만 첨가 되있는 것을 볼
수 있다. 따라서 함수의 기능을 새로 공부할 필요는 없고 단지 "쓰고 읽는" 곳
이 "파일"로 만 바뀌었다고 생각하면 될 뿐이다.
하나씩 살펴 보면 첫째로 (요기 1)에서 file을 open 하는 것을 볼
수 있다.여러분께서는 아직도 그래픽을 사용 할 때도, 위와 같이 "여는
(open)" 과정이 있었던을 기억 할 것이다(initgraph()).
파일을 사용할 때도 마찬가지로 미리 준비를 좀 할 게 있어서 위와
같이 꼭 fopen()을 해 줘야 하는데, 여기서 일단 관심 있게 볼것은 변수
"xxx"이다.
이 xxx 는 이름이 의미 하는 것 처럼 자기 맘대로 짓는 이름이다. 하지만 이
변수의 용도는 분명히 알아야 한다.
지금 fopen()에서는 짐작으로라도 "my2.doc" 라는 함수를 열겠다는
뜻으로 알 수 있을 것이다. 그러나 C 프로그램에서 이렇게 opem을 하고 나면
더이상 "my2.doc"라는 이름은 쓰지 않고 그대신 xxx 라는 이름으로 씌여진
다.
그리하여 (요기 2)를 보면 'a'라는 한글자를 파일에 쓴다는 의미로
fputc('a', xxx)를 사용하는데 , 그 쓰는 곳을 나타내는게 xxx임을 보라.
언젠가도 비슷한 예가 있었는데, 예를 들어 "홍길동" 이 감옥에 들
어갔다고 치자. 그러면 감옥을 열고 (open) 들어가는 순간 "죄수번호"를 부
여 받는다. 즉 위에서는 "my2.doc" 대신 변수 xxx에 값을 넣어주는 과정이
다.
xxx = fopen("my2.doc","wt");
그리하여 앞으로는 홍길동 이라는 이름대신 "118호 밥먹어" 이런식
으로 불리는 것이다. (요기 2) 에서도 마찬가지로 한글자를 "my2.doc"에 쓰
고 싶어도 아래와 같이 변수명 xxx를 써야 하는 것이다.
fputc('a' , "my2.doc"); <-- 틀림
fputc('a' , xxx); <-- 맞음
물론 파일을 닫을 때도 아래와 같이 xxx를 써야 한다. (요기 3) 참조.
fclose("my2.doc"); <--- 틀림
fclose(xxx); <--- 맞음
다시 말해서 진짜 파일 이름 "my2.doc"는 함수를 open하고 난 이후로는 볼
생각을 하면 안된다.
위의 프로그램를 컴파일 하고 dir로 my2.doc를 찾아 보자. 진짜로 우리가 짠
프로그램이 파일을 만들었는지.
이제 debug 로 다시 my2.doc를 읽어 보자. my.doc와 다른 것이 아무
것도 없다. 이제는 이세상의 아무도 "my.doc" 와 "my2.doc"가 어떻게 생겨
났는지를구별 할 수 있는 사람은 없다.(지금 우리 빼고)
이게 "가장 간단한" C 의 파일 생성법 이다. 그러면 더 복잡한 생성
법은 무엇 인가 ? 미안 하지만 없다. 파일 자체를 생성하는 것은 위와 같이
3단계만 거치면 될 뿐이다. 다만 이것도 파일을 맘먹은대로 주물러 보려면
조금더 복잡한 함수들이 필요할 뿐이다.
자 이제 파일을 더욱 실용적으로 써먹기 위해서 조금더 연습을 하자. 가장
쉬운 예는 숫자를 처리 하는것 인데 여러분들이 지금 학교 선생님이라고 하
고 학생들 성적 합계를 낸다고 하자.(아니면 개인적으로 장부정리를 할 사람
은 자기에 맞게 고쳐 보자). 일의 순서는 이렇다.
1. 터보 씨나 아래 한글 에디터에 들어가서 시험지를 보고 점수를 파일에
칩니다(간단히 하기 위해 점수만 칩니다)
아래 형태 다 좋습니다.
--------< 형태 1>--------- ----------< 형태 2>---------
100 10 100
10
-------------------------- ----------------------------
2. 파일을 저장하고 빠져 나옵니다. 아래 한글은 [ASCII 파일]로 저장함
파일 이름은 score.doc로 합니다.
3. 이제 간단한 C 프로그램을 짭니다. 위의 예와 비슷하지요
/*-----------------------------*/
#include <stdio.h>
FILE *xxx;
int score, total;
main()
{
xxx = fopen("score.doc","rt");
fscanf(xxx,"%d",&score); <-- (요기 1)
total = score;
fscanf(xxx,"%d",&score);
total += score;
fclose(xxx);
printf(" total = %d", total);
}
/*-----------------------------------*/
fscanf()란 함수는 우리가 잘 아는대로 scanf() 기능과 똑같은데,
다만 데이타를 키보드에서 읽어 오는 것이 아니고, 파일에서 읽어 올 뿐이
다. 위에서는 xxx에서 읽어 온다고 명시를 하고 있다.
그리고 fscanf() 가 파일에서 데이타를 한꺼번에 읽어 들이는 단위
는 "공백문자(whitespace)"를 만나기 전 까지이다
-----------------< 암기 필요 >---------------------
"공백문자" 는 말 그대로 글자가 파일에 있기는 있는데
공백으로 보이는 문자 이다. 즉
Space key(0x20), Tab(0x09), Newline(0x0a)
3 개 이다
---------------------------------------------------
즉 여기서 알아야 할 것은 좌우간 두개의 숫자 사이에 "공백 문자"만 있으면
된다는 것이다.그러면 결과적으로 두가지 형태다 처음에 100, 두번째 10을
읽어서 더하게 된다.
여기서는 문제를 간단히 하기 위해서 두개의 숫자만 했는데 여러개로 확장하
는 건 나중에 for, while 같은 순환문만 돌리면 될 것이다.
만일 한 학생에 대하여 국어 영어 수학의 데이타를 아래 형태대로 한다면 약
간만 고치면 된다.
----------------------
데이타 형태
----------------------
100 90 80
11 100 90
100 100 100
80 80 80
/*-------------------*/
#include <stdio.h>
FILE *xxx;
int korea,english,math;
int total_korea, total_english, total_math;
main()
{
xxx = fopen("score.doc","rt");
fscanf(xxx,"%d %d %d",&korea, &english, &math);
total_korea = korea;
total_english = english;
total_math = math;
fscanf(xxx,"%d %d %d",&korea, &english, &math);
total_korea += korea;
total_english += english;
total_math += math;
fclose(xxx);
}
/*--------------------------*/
여기서도 지금 단계에서 알아야 할 것은
1. 우리눈에는 안 보이지만 "공백문자"가 있어서 fscanf 라는 함수가 각
점수를 구별해서 읽을 수 있다는 것 과
2. 또 우리는 debug를 통해서 공백 문자가 어떻게 들어 있는지 그 파일
의 내부 모습을 분명히 알았다는 사실 이다.
-----------------------------------------------------------------------
6> 프린터로 출력
-----------------------------------------------------------------------
다음과 같이 프로그램을 짜고 실행하자.(프린터를 켜놔야 한다)
#include <stdio.h>
main(int argc, char *argv[])
{
int i;
for(i=0; i < 10; i++)
fprintf(stdprn,"This is test string for printer\r\n");
}
프린터를 안 갖고 있는 분도 많지만 이것이 화일을 직접 써먹는 가장 간단한
예이다. printf() 대신에 fprintf()를 썼는데 "file printf"의 준말이다. 지
금 우리의 주제인 파일로 문장을 쓰라는 것이다. 여태 우리가 써온 printf()
는 "모니터"에다 쓰라는 가장 단순한 형태였다. fprintf()는 우리가 쓰고 싶
은 대상을 위에 보다시피 stdprn 이라고 직접 명시 해줌으로서 우리의 작업
영역을 더 넓힐 수 있다.
stdprn은 (STanDard PRiNter)의 준말인데 내맘대로 쓴게 아니고 터
보 C에서 미리 정해준 이름이다. 따라서 앞으로 여태까지 모니터에 찍던것을
프린터에 찍고 싶으면 printf() 대신 fprintf(stdprn,...) 형태로만 쓰면 만
사 O.K 다.
다만 차이는 프린터는 위로 올라 가지 못한다는 것과 줄을 바꿀때
약간의 차이인데 프린터에서는 "\n" 만 써서는 안되고 "\r\n"을 해야 줄이
바뀐다는 것 뿐이다.
이제 ASCII code에 대한 이해도 조금 넓혀야 되는데, ASCII code 표
에서 0x0c를찾아보자. 이 기능은 (Form Feed)로서 여러분들 프린터에 꼭 있
는 단추(button)이다. 이 단추를 누르면 종이가 한장 위로 "우당탕" 거리며
올라간다(Dot printer의 경우).(ink jet 프린터는 조용히 한장 올라감)
위의 프로그램에 이 기능을 첨가 하자(요기 부분)
#include <stdio.h>
main(int argc, char *argv[])
{
int i;
for(i=0; i < 10; i++) {
fprintf(stdprn,"This is test string for printer\r\n");
}
fprintf(stdprn,"\f"); /* <-- (요기) form feed */
}
어떤가 우당탕 거리며 넘어가는가 ? 이런것이 소프트웨어로 하드웨어를
control하는 가장 간단한 예이다.
C 에서는 하드디스크 안에 있는 xxxxx.xxx 같은 화일과 함께 프린터
도 하나의 화일로 간주한다. 이 화일의 이름이 위에 적은데로 stdprn 이었
다.
-----------------------------------------------------------------------
7> 화일의 입출력
-----------------------------------------------------------------------
하드디스크안에 있는 화일을 불러오고 값을 쓰고 하는 것은 위의 프린
터 화일에 비해 다소 복잡하다. 그렇지만 상투적으로 쓰는 부분이 있어서 여
러분도 적당히 복사해다가 조금씩 고쳐나가면 된다. 하지만 조금 익숙해지면
내용적으로 공부를 더 해야함은 물론이다. 아래 예를 mycopy1.c 라는 이름으
로 복사하여 실행하자
#include <stdio.h>
main()
{
int c;
FILE *from, *to; /* <-- <요기 1> */
from = fopen("my2.doc","rb"); /* <-- <요기 2> */
to = fopen("chungha.doc","wb"); /* <-- <요기 3> */
while(( c = fgetc(from)) != EOF) /* <-- <요기 4> */
fputc(c,to);
}
위에서 만든 my2.doc를 "chungha.doc"로 복사하는 프로그램이다.
이 프로그램은 mycopy1.exe 로 존재하고 있을 것이고 "my2.doc" 과 같은 디
렉토리에 있어야 함은 물론이다. 성공적으로 수행하고 나면 도스 명령어로
비교하자
c:\tc\> comp my2.doc chungha.doc
이 명령어는 두화일이 똑같은가 비교(COMPare)하는 것이다. 성공적
으로 복사가 되었는가 ? 이 프로그램을 간단히 설명하자.
<요기 1> --> FILE *from, *to;
여기서 *from 과 *to 는 내 맘대로 지은 변수명이지만 반드시 일차
원 포인터로 FILE 타입 이어야 한다. FILE 타입은 처음 나오는 것인데, 대문
자로 쓴걸로 봐서 어디엔가 define 되있을 것이다. 우리는 항상 이 형태로
쓰자. 변수명 from, to는 무슨 용도로 쓰이는가 하면 "죄수 번호"다.
<요기 2> --> from = fopen("my2.doc","rb");
fopen()은 file open()의 준말이다. 말그대로 "my2.doc"이라는 화일
을 연다는 것이다. C 에서 화일을 취급하는 방법은 사무실에서 화일을 다루
는 것과 똑같다. 모든 화일은 캐비넷안에 서류로 보관되있다. 우리가 이 서
류를 복사하려면 좌우간 "열어서" 꺼내야 한다. "rb"는 (read + binary)의
준말이다. 이 서류는 읽기만 할 것이지 쓰지는 않는다는 뜻이고 binary는 "
텍스트 화일이 아니라는" 뜻이다.
my2.doc 은 현재 텍스트 화일이지만 이걸 이진(binary)화일로 읽는
다고 별 문제는 없다. 그러나 거꾸로 이진 화일을 텍스트 모드로 읽는 것은
불가능하다. 다시 말해서 이진 모드로는 무엇이든지 읽으 수 있으므로 현재
b 타입으로 했다.
from 이라는 변수가 "화일 my2.doc 을 열어라 " 하는 명령의 대답을
들었다. 이것은 위에 말한대로 죄수 번호다.
여기서도 마찬가지로 자기의 이름"my2.doc" 는 더이상 불리지 않는
다.from 변수는 죄수번호를 부여 받는다. 앞으로는 "my2.doc 에서 읽어라"
대신에 "from 에서 읽어라" 로 쓸것이다.
여기 감옥에 죄수를 수용할 수 있는 용량을 알아볼 수 있다. 루트
디렉토리로 가서 c:\>type config.sys 를 해보라. FILE = 20 같은 문장을
찾아볼 수 있다. 이 말은 죄수 20 명 까지 수용할수 있다는 얘기다. 조금더
유식하게 얘기하면 "화일을 동시에 open 할수 있는 최대값은 20 개" 라는 얘
기다.
<요기 3> ---> to = fopen("chungha.doc","wb");
이것도 마찬가지로 "chungha.doc"라는 화일을 write용도로 열었다.이
것은 하드 디스크에 이미 같은 이름이 있건 없건 무조건 엎어 쓴다. 여기서
도 물론 "chungha.doc" 대신에 to 라는 죄수명을 부여 받았다.
<요기 4> ---> while(( c = fgetc(from)) != EOF)
fputc(c,to);
fgetc 는 file + getc() 의 준말이다. 즉 어떤 화일명에서 한글자를
읽어오라는 얘기다. 여기서는 죄수 from 에게서 한글자를 읽었다. 그리고
EOF (End Of File)과 비교했는데, 말로 하면 "한글자를 읽고 이게 화일의 끝
이 아니면 파일 to 에게 그 글자를 쓰라" 이게 전부 돌아가면 화일 하나가
전부 복사 되는 것이다.
여기서 EOF 은 ASCII code표에서 0x1a ([^Z])를 define해놓은 것이
라고 했다. 따라서 전세계 의 프로그래머들은 화일의 끝을 찾으려면 이 글자
만 혈안이 되서 뒤진다.(텍스트 파일인 경우)
이런 약속을 약간 어긴사람들이 있는데 아래한글의 xxx.hwp 화일 들
이다.
이걸 도스 명령어 type xxx.hwp 를 해보면 상당히 긴 화일임에도 불구하고
"HWP Document File V2.00" 하는 메시지만 나온다. 이 글자뒤에 일부러 EOF
글자를 끼워넣었기 때문이다.
여러분이 pc-tool 같은 프로그램에서 xxx.hwp화일을 불러다가 이
EOF글자를 지운다면 type 명령으로 나머지 부분을 다 볼 수 있다. 그러나 이
화일은 순수한 텍스트 화일이 아니기 때문에 볼수는 있어도 뜻을 알기는 어
려울 것이다.
이 프로그램은 보다시피 한번 컴파일 되면 우리가 화일 이름을 맘대
로 바꿀수 없다. 죽으나사나 "my2.doc" ---> "chungha.doc" 로만 바꿔야 한
다. 삼척동자라도 이 프로그램은 개선되야 한다고 느낄 것이다. 실제 copy
명령어 같은 형태로 바꿔보자. 대통령에게서 명령을 받는다.
main(int argc, char *argv[])
{
int c;
FILE *from, *to;
if(argc != 3) { /* <--- <요기 1> */
clrscr();
printf("Usage error !");
exit(); /* <--- <요기 2> */
}
from = fopen(argv[1],"rb"); /* <--- <요기 3> */
to = fopen(argv[2],"wb"); /* <--- <요기 4> */
while(( c = fgetc(from)) != EOF)
fputc(c,to);
}
이 프로그램을 실행 시킬려면
c:\tc>copy xxxx.xxx yyyy.yyy
이런 형태로 쳐야 함을 알것이다. 즉 3 단어를 쳐야 한다. <요기 1>
에서 단어 3개를 맞게 쳤는지 검사하고 있다. 틀리면 <요기 2> 에서 프로그
램을 끝내고 있다.
<요기 3> 에서 대통령께서 하사하신 화일명을 쓰고 있다. 두번째 친
단어임을 잊지 말라.
<요기 4> 에서 3번째 친 단어를 이용하고 있다.
<숙제> c:\> type my2.doc을 쳐보면 my2.doc을 화면에서 볼 수 있다.
"mytype.c"를 하나 짜서 똑같은 기능을 하도록 하라.
참고로 fputc(c,to) ---> fputc(c, stdout) 하면 모니터로 내 보낼
수 있고 stdout 은 stdprn 처럼 특별히 "fopen()"을 하지 않아도 된
다.
<숙제> 키보드 입력을 받아 화일로 복사하는 프로그램을 작성하라
키보드도 하나의 화일로 간주하는데 이름은 stdin 이고 역시 fopen()
은 불필요하다. 끝을 나타내는 글자는 천리안사용자는 줄 바꾸고 처
음에서'.' 로 하고 하이텔사용자 는 [컨트럴 Z] (0x1a)로 하라. 즉
이 글자를 받으면 화일 끝에다 0x1a를 첨가하고 프로그램입력을 중
지하고 끝내라는 뜻이다..
<숙제> 키보드 입력을 받아서 프린터로 출력하는 프로그램을 짜라. 끝은
FF(0x0c) [^L]를 내보내라.
<숙제> my2.doc같은 텍스트 화일을 프린터로 뽑는 mycopy.c를 짜보라
****************************< 마치는 글 >******************************
수고 하셨습니다.
***********************************************************************