2008. 10. 31. 16:03

 

11.1 표준 입·출력 함수

표준 입·출력 함수는 자료의 기록, 판독에 대하여 다음과 같이 4가지 방법을 사용한다.

① 키보드로부터 자료를 읽어서 화면에 자료를 나타내는 방법으로 한 번에 한문자만을기록, 판독하는 방법

(예: getchar(), getc(), getch(),putchar(), putc(), putch())

② 키보드에서 문자열을 읽어서 화면에 문자열을 나타내주는 방법

(예: gets(), puts())

③ 문자, 문자열, 부동 소수점, 정수 등을 혼합하여 형식화된 자료를 기록하거나 판독하는 방법

(예: fscanf(), fprintf())

④ 레코드 또는 블록 형식을 이용하여 자료의 기록 및 판독을 행하는 방법 등이 있다.이중 2가지 방법은 이미 배운바 있으나 정리하면서     간략히 설명하고 3,4번째 방법에대해 자세히 기술한다.

단일 문자 입·출력

■ 입 력

키보드로부터 1문자를 입력하는 형식은 다음과 같다.

 

getchar()

getch()

getc(화일 포인터)

 

getchar(), getch(), getc() 함수의 사용 방법은 동일하나 getch() 함수는 화면에 문자가 나타나지 않으며 getc() 함수는 인수로서 읽고 쓸 화일의 이름을 꼭 밝혀 주어야 한다.

■ 출 력

1 문자를 화면에 출력하는 형식은 다음과 같다.

 

putchar()

putch()

putc(문자, 화일 포인터)

 

putchar(), putch(), putc() 함수의 사용 방법은 동일하나, putchar(), putch() 함수는 화면에서 출력만으로 사용하며 putc() 함수는 화일 포인터에 문자를 저장할 수 있다.

 

 [예제 11-1] putchar() 함수 사용 방법

 #include <stdio.h>

void main()

     {

         char ch;

         while((ch = getchar()) != '\r')

         putchar(ch);

     }

 TurboC example

TurboC example

 

 

[예제 11-2] putch() 함수 사용 방법  

#include <stdio.h>

void main()

    {

        char ch;

        while((ch = getch()) != '\r')

        putch(ch);

    }

TurboC example 

 

 

[예제 11-3] getc(), putc() 함수 사용 방법  

 #include <stdio.h>

void main()

     {

          char ch;

          while((ch = getc(stdin)) != '\r')

          putc(ch,stdout);

     }

TurboC example

TurboC example 

 

 

문자열의 입·출력

문자열의 입·출력에 대한 형식은 다음과 같다.

 

gets(문자열)

puts(문자열)

 

gets() 함수는 표준 입력 장치(스트림 입력 장치라고도 함)으로부터 문자열을 입력으로 받아들여 문자열에 대한 포인터를 반환하는 함수이다 이때 주의할 점은 문자열 버퍼의 끝에 NULL('\0')이 자동적으로 부가되어 저장되므로 입력의 문자 수보다 적어도 하나 이상의 저장공간이 확보되어야 한다. puts() 함수는 표준 출력 장치로 문자열을 보내는 함수이다. 이 함수는 printf()의 제어지시를 이용하여 문자열을 간단히 출력할 수 있으므로 잘 사용하지 않는다.

 

[예제 11-4]  

#include <stdio.h>

void main()

     {

          char string[80];

          printf("Input a string:");

          gets(string);

          puts(string);

     }  

Input a string:This is sample string

This is sample string 

 

 

11.2 화일의 개방과 종결

본 절에서는 보조 기억장치를 이용한 화일의 기록, 판독에 대한 초기 과정, 화일의 개방과 종결에 대해 기술한다.

화일의 개방

화일은 보조 기억장치에서 읽어오거나 보조 기억장치로 기억시키기 위해서는 화일을 개방하여야 한다. 화일을 개방하기 위해서는 화일이름을 읽을 것인지 기억 시킬것인지를 운영체제에 정보를 제공해 주어야 한다. 운영 체제는 보조 기억장치(주로 디스크 장치 이용)에서 정보를 읽을 것인지 또는 기억할 것인지에 대한 정보를 포인터로써 돌려주게 된다. 따라서 개방되는 화일은 구조체를 가지게 된다.

화일 구조체는 자료 버퍼의 현재 크기와 위치 등의 화일에 관한 정보를 포함하며 반드시 #include <stdio.h> 할 필요가 있다.

프로그램에서 화일 구조체에 대한 포인터형의 변수 선언과 화일을 개방하는 문장은 다음과 같다.

예)#include <stdio.h>

FILE *fp;

fp=fopen("kim.dat","w");

여기서 *fp는 포인터 화일 변수이며 fopen() 함수는 fp변수에 저장된 화일 구조체에 대한 포인터를 돌려준다. 개방 화일은 "kim.dat"이며 화일에 자료를 기록하라는 의미가 "w"이다.

<stdio.h> 화일에 미리 정의되어 개방되는 스트림은 다음과 같다.

 

이 름

장 치

모 드

stdin

stdout

stderr

stdaux

stdprn

표준 입력 장치(키보드)

표준 출력 장치(화면)

표준 에러 장치(화면)

표준 보조 장치(직렬 포트)

표준 출력 장치(병렬 프린터)

텍스트 모드

텍스트 모드

텍스트 모드

2 진 모드

2 진 모드

 

FILE 구조체에 대한 포인터형의 변수와 화일의 개방함수 fopen()에 대해 생각해 보자. fopen() 함수의 목적은 입·출력 동작을 하기 위해 화일을 개방하는데 사용되며 형식은 다음과 같다.

 

FILE *fopen(화일명, 접근 모드)

 

여기서 접근 모드는 개방하고자 하는 화일의 모드를 결정하는 문자열을 말하며 다음과 같은 사용 모드를 제공하고 있다.

 

분 류

접근 모드

접근 내용

읽 기

r

읽기 전용으로 기존의 화일을 개방

쓰 기

w

a

쓰기 전용으로 새로운 화일을 생성

추가로 쓰기 위해 화일을 개방

갱 신

r+

w+

a+

갱신을 위해 기존의 화일을 개방

갱신을 위해 새로운 화일을 생성

갱신을 위해 화일의 끝에 개방

2진 모드

"rb", "wb", "ab"

"r+b" 또는 "rb+"

"r+a" 또는 "ra+"

2진 화일에 대해 r,w,a 기능 수행

2진 화일에 대해 r+ 기능 수행

2진 화일에 대해 a+ 기능 수행

 

화일 닫기 화일을 개방하여 그 화일에 대한 기록과 판독이 끝나면 그 화일을 닫아야만 한다. 화일을 닫는 형식은 다음과 같다.

 

fclose(화일 포인터)

11.3 화일 입·출력 함수

이 절에서는 화일의 기록과 판독에 따른 입·출력 형식에 대해 기술한다.

문자 단위 화일 입·출력 함수

일단 화일을 개방하면 디스크에 기록시키거나 디스크에서 화일의 내용을 읽어올 수가 있다. 문자 단위 화일 입·출력 형식은 다음과 같다.

 

fgetc(화일 포인터)

fputc(문자, 화일 포인터)

 

 

[예제 11-5] fputc() 함수를 이용하여 화일에 출력하는 프로그램  

 #include <stdio.h>

void main()

     {

          FILE *fp;

          char ch;

          fp=fopen("kim.dat","w");

          while((ch=getch()) != '\r') {

               putch(ch);

               fputc(ch,fp);

          }

          fclose(fp);

     }

"kim.dat"화일에는 키보드를 통해서 입력된 문자가 저장된다. 

 

 

[예제 11-6] fgetc() 함수를 이용하여 화일에 있는 내용을 화면에 출력하는 프로그램  

#include <stdio.h>

void main(void)

     {

          FILE *fp;

          char string[] = "This is a test";

          char ch;

          if((fp=fopen("kim.dat", "r")) == NULL) {

               printf("\n File not found");

               exit(-1);

          }

          do

          {

               ch = fgetc(fp);

               putch(ch);

          } while (ch != EOF);

          fclose(fp);

     }

"kim.dat" 화일에 있는 내용이 화면에 출력된다.

만약 "kim.dat"라는 화일이 없으면

"File not found" 라는 메시지가 출력된다.

  

 

  문자열의 화일 입·출력 함수

화일에서 문자열을 판독하거나 화일 문자열을 기록하는 형식은 다음과 같다.

 

fgets(문자열, 최대 길이, 화일 포인터)

fputs(문자열, 최대 길이 화일 포인터)

 

fgets() 함수는 화일 포인터로부터 입력행을 읽어 문자 배열에 저장하고 현재 위치로부터 한 레코드 또는 (최대 길이-1)개의 문자가 읽혀지면 개행문자를 만나면 끝낸다. 마지막 문자가 정상적으로 읽혀지면 NULL('\n')을 추가시키며 화일의 끝이거나 에러이면 NULL을 반환한다.

fputs() 함수는 화일 포인터가 지시하는 화일에 문자열을 기록하라는 것을 의미하며 정상이면 0을 화일의 끝이거나 에러이면 EOF(-1)을 반환한다.

 

[예제 11-7] fgets(), fputs() 함수 사용 방법  

#include <stdio.h>

void main()

     {

          FILE *fp,*fp1;

          char string[30];

          fp=fopen("kim1.dat","w");

          fp1=fopen("kim.dat","r");

          while(fgets(string,30,fp1) != NULL)

          fputs(string,fp);

          fclose(fp);

          fclose(fp1);

}

c:>type kim.dat

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screen at

me from dugout because I resealed too much. Now he's

posing in magazine ads in his underwear.

   

 

 

"kim1.dat" 화일에는 "kim.dat"화일에 있는 내용과 동일하다.

형식화된 화일 입·출력 함수

지금가지 문자와 텍스트를 화일에 기록하거나 판독하는 것을 다루었다. 여기서는 수치 자료를 다루기 위해서 형식화된 입·출력 함수에 대해 설명한다. 형식화된 입·출력 함수에 대한 다음과 같다.

 

fscanf(화일 포인터, 제어문자열, 인수)

fprintf(화일 포인터, 제어문자열, 인수)

 

fscanf() 함수fprinf() 함수는 화일 포인터를 제외하고는 scanf() 함수와 fprintf() 함수와 동일하다. fscanf() 함수는 화일로 부터 지정된 형태로 읽어들여 뒤에 오는 인수에 대입하고 화일의 끝이거나 에러가 발생하면 EOF를 반환하고 그렇지 않을 경우에는 입력된 항목의 수 를 반환한다.

fprintf() 함수는 지정된 형태를 화일에 출력하고 화일에 쓰여진 문자의 수를 반환하고 에러가 생길 경우에는 음수(-)의 값을 반환한다.

 

[예제 11-8] 성적을 저장하는 프로그램  

#include <stdio.h>

void main()

     {

          FILE *fp;

          char name[20];

          int number;

          int kor;

          int eng;

          int math;

          int total;

          int i=0;

          fp=fopen("grade.dat","w");

          do {

               printf("Enter name, number, Kor, Eng, Math : ");

               scanf("%s %d %d %d %d",name, &number, &kor, &eng,                          &math);

               total=kor+eng+math;

               fprintf(fp,"\n%s %d %d %d %d %d",name, number, kor, eng,

                         math, total);

               i++;

          } while(i <4);

          fclose(fp);

     }

Enter name, number, Kor, Eng, Math : kim 1 57 87 45

Enter name, number, Kor, Eng, Math : kim1 2 67 45 76

Enter name, number, Kor, Eng, Math : kim2 3 76 45 95

Enter name, number, Kor, Eng, Math : kim3 4 67 45 87

c:>type grade.dat

kim 1 57 87 45 189

kim1 2 67 45 76 188

kim2 3 76 45 95 216

kim3 4 67 45 87 199 

 

 

[예제 11-9] 성적이 있는 화일을 읽어서 화면에 출력하는 프로그램  

 #include <stdio.h>

void main()

     {

          FILE *fp;

          char filename[15];

          char name[20];

          int number;

          int kor;

          int eng;

          int math;

          int total;

          printf("Enter name of a file to open foe WRITING : ");

          gets(filename);

          if((fp=fopen(filename,"r")) == NULL) {

               printf("\n File not found");

               exit(-1);

          }

          printf("\n Name Number KOR ENG MATH TOTAL");

          do {

               fscanf(fp,"%s %d %d %d %d %d",name, &number, &kor,

                         &eng, &math, \&total);

               printf("\n %-10s%3d %3d %3d %3d %3d", name, number, kor,                          eng, math,total);

          } while(!feof(fp));

          fclose(fp);

     }

Enter name of a file to open foe WRITING : grade.dat

Name Number KOR ENG MATH TOTAL

kim 1 57 87 45 189

kim1 2 67 45 76 188

kim2 3 76 45 67 216

kim3 4 67 45 87 199 

 

 만일 "grade.dat"라는 화일이 없으면 "File not found"라는 메시지가 출력된다.

레코드 단위의 화일 입·출력 함수

형식화된 화일 입·출력 함수는 각 숫자가 문자로서 저장되기 때문에 디스크의 공간을 많이 차지하게 된다.

또한 배열이나 구조체 같은 복잡한 자료 형을 읽거나 기록할 때 직접적인 방법이 없다.

배열을 한 번에 배열 요소 하나를 저장하기 때문에 비 효율적이며 구조체는 여러 부분으로 나누어서 저장해야 한다.

이러한 문제점을 해결하는 것이 레코드 단위의 입·출력이다. 레코드 단위의 입·출력은 수치를 정수형은 2바이트,

실수형은(부동 소수점형)은 4바이트를 2진 형식으로 쓰기 때문에 메모리를 효율적으로 이용할 수가 있다.

한꺼번에 많은 자료를 취급할 수가 있으며 배열, 구조체, 배열의 구조체, 그리고 다른 자료 구조를 단일 문장으로 사용할 수가 있다.

형식은 다음과 같다.

 

fwrite(문자열, 크기, 항목수, 화일 포인터)

fread(문자열, 크기, 항목수, 화일 포인터)

 

fwrite() 함수는 지정된 갯수 만큼의 자료를 화일에 저장하며 fread() 함수는 주어진 화일 로부터 지정된 갯수만큼의 자료를 읽어서 문자열에 저장한다.

 

[예제 11-10] fwrite() 함수를 이용한 프로그램  

#include <stdio.h>

void main()

     {

          struct {

               char name[20];

               int number;

               float height;

          } man;

          FILE *fp;

          float dummy=0.0;

          if((fp=fopen("kim.dat","wb")) == NULL) {

               printf("\n File not found");

               exit(-1);

          }

          do {

               printf("\n Enter name : ");

               gets(man.name);

               printf(" Enter number : ");

               scanf("%d",&man.number);

               printf(" Enter height : ");

               scanf("%f",&man.height);

               fflush(stdin);

               fwrite(&man, sizeof(man),1,fp);

               printf("Add another man(y/n) ?");

          } while(getch() == 'y');

          fclose(fp);

     }

Enter name : kim1

Enter number : 1

Enter height : 34.83

Add another man(y/n) ?

Enter name : kim2

Enter number : 2

Enter height : 67.56

Add another man(y/n) ? y

Enter name : kim3

Enter number : 3

Enter height : 84.54

Add another man(y/n) ? n 

 

 

[예제 11-11] fread() 함수을 이용한프로그램  

#include <stdio.h>

#include <stdlib.h>

void main()

     {

          struct {

               char name[20];

               int number;

               float height;

          } man;

          FILE *fp;

          fp=fopen("kim.dat","rb");

          while(1) {

               fread(&man, sizeof(man), 1, fp);

               if(feof(fp)) {

                    fclose(fp);

                    exit(-1);

               }

               printf("\n Name : %s", man.name);

               printf("\n Numer : %d", man.number);

               printf("\n Height : %4.2f",man.height);

           };

     }

Name : kim1

Number : 1

height : 34.83

Name : kim2

Number :2

height : 67.56

Name : kim3

Number : 3

height : 84.54  

 

 여기서 feof() 함수는 화일의 끝을 검사하는 함수이며 화일 포인터가 가리키고 있는 화일이 모두다 판독되면 ZERO(0)가 아닌 값을 반환하고 그렇지 않으면 0을 반환한다.

exit(n) 함수는 프로그램의 실행중 중도에 끝내고 싶을 때 이용되는 함수이며 n은 0이 아니어야 프로그램의 수행을 종료하는 함수이다.

화일 포인터의 제어 함수

이제가지의 순차화일에 비해 다소 조작 방법이 복잡하지만 어디서든지 읽고 쓰기 가능한 방식은 "랜덤화일처리"라고 하며, 랜덤화일처리에서 어느 부분을 읽을 것인지를 지정할 수 있는데 이를 수행하는 함수가 fseek() 이다.

fseek() 함수는 화일의 위치를 자유로이 지정하는 함수로서 다음과 같은 형식을 갖는다.

 

fssek(화일 포인터, 변위, 기준 점)

 

화일 포인터의 화일 위치를 기준점을 기준으로 하여 변위 바이트만큼 이동하여 정상시는 0, 오류시는 0 이외의 값을 반환한다.

이때 기준점의 위치 설정에 따라 3가지로 나누며 이에 대한 상수 및 의미는 표 11-3과 같다.

 

상 수

실 제 값

의 미

SEEK_SET

SEEK_CUR

SEEK_END

0

1

2

화일의 처음

현재 화일 포인터의 위치

화일끝 검출 위치

 

한 편 fseek() 이외의 랜덤 처리계 함수 및 기능은 표 11-4와 같은 종류가 있다.

 

함수명

기 능

fflush

fgetpos

fsetpos

ftell

rewind

버퍼에 넣으려는 전체의 문자를 화일에 씀

화일 위치의 정보를 읽음

화일 포인터의 위치 설정

현제의 화일 위치 파악

화일의 위치를 선두로 이동

 

 

[예제 11-12] fseek() 함수를 사용한 프로그램  

#include <stdio.h>

#include <stdlib.h>

void main()

     {

          struct {

               char name[20];

               int number;

               float height;

          } man;

          FILE *fp;

          int rec_no;

          long int offset;

          fp=fopen("kim.dat","rb");

          printf("Enter record number : ");

          scanf("%d",&rec_no);

          offset=(rec_no-1) * sizeof(man);

          if(fseek(fp,offset,SEEK_SET)) {

               printf("\n Can't move pointer there.");

               exit(-1);

          }

          fread(&man, sizeof(man), 1, fp);

          printf("\n Name : %s", man.name);

          printf("\n Numer : %d", man.number);

          printf("\n height : %f",man.height);

          fclose(fp);

      }

Enter record number : 2

Name : kim2

Numer : 2

height : 67.55998 

 

 

11.4 메모리 할당

지금까지 다루어온 자료의 저장 방법은 표준 변수들을 사용하여 기억 장소를 미리 확보하여 확보된 영역에서의 자료의 저장 방법을 다루었다.

예를 들어 배열 선언에서 100개의 원소를 취하는 배열을 확보하고 5개의 원소만을 취한다면 95개의 원소는 빈 공간으로 남아 기억 공간이 낭비가 된다.

이 절에서는 자료의 크기가 동적으로 변할때 메모리의 확대가 가능한 메모리 할당 에 대하여 기술한다. c언어에서는 malloc() 함수를 제공하여 처리하고 있다. malloc() 함수의 사용 형식은 다음과 같다.

 

malloc(arg)

 

여기서 arg는 메모리의 바이트를 표시하는 양의 정수이며 새로운 메모리의 블럭 시작점에 대한 포인터를 반환한다.

 

[예제 11-12] malloc() 함수를 이용한 프로그램  

#include <string.h>

#include <stdio.h>

void main()

     {

          char temp_string;

          temp_string=(cahr *) malloc(100);

          strcpy(temp_string,"Hello Kang");

          printf("Enter string : ");

          fgets(temp_string,100,stdin);

          printf("Your input string is %s",temp_string);

     }

Hello Kang

Enter string : Good morning !

Your input string is Good morning !

 

 

다음 표 11.5는 표준 입·출력 함수에 대하여 총괄적인 의미를 보인 것이다.

 

함 수 명

형 식

의 미

getc(fp)

getc(fp)

FILE *fp;

fp가 가르키는 화일로부터 한 문자 입력

putc(c,fp)

putc(c,fp)

int c;

FILE *fp;

fp가 가르키는 화일로 한 문자 출력

fgetc(fp)

fgetc(c)

int c;

fp가 가르키는 화일로부터 한 문자 입력

fputc(c,fp)

fputc(c,fp)

int c;

FILE *fp;

fp가 가르키는 화일로 한 문자 출력

fgtes(s,n,fp)

fgtes(s,n,fp)

char *s;

int n;

FILE *fp;

화일 fp에 최대 n바이트의 문자열 s를 입력

fputs(s,fp)

fputs(s,fp)

char *s;

FILE *fp;

화일 fp에 문자열 s를 출력

fprintf(fp,format,인수)

fprints(fp,format,인수)

FILE *fp;

char *format;

화일 fp에 지정된 형태 format에 따라 출력

fscanf(fp,format,인수)

fscanf(fp,format,인수)

FILE *fp;

char *format;

화일 fp에서 지정된 형태 format에 따라 입력

fread(s,n,item,fp)

fread(s,n,item,fp)

char *s;

int n;

int item;

FILE *fp;

화일 fp에서 지정된 갯수 만큼의 데이타를 읽어 문자 열 s에 입력

 

 

연 습 문 제

 

[문제 11-1] 화일을 읽어서 대문자는 소문자로 소문자는 대문자로 변환하는 프로그램  

#include <stdio.h>

void main()

     {

          int ch;

          FILE *fp, *fp;

          char filename1[13], filename2[13];

          printf("\n Input filename : ");

          gets(filename1);

          fp=fopen(filename1,"r");

          printf(" Output filename : ");

          gets(filename2);

          fp1=fopen(filename2,"w");

          while((ch=fgetc(fp)) != EOF) {

               if(ch >= 'A' &&ch <='Z')

                    fputc(ch + 32, fp1);

               else if(ch >= 'a' &&ch <='z')

                    fputc(ch-32,fp1);

               else

                    fputc(ch,fp1);

          }

     }

Input filename : in_letter.dat

Output filename : out_letter.dat

c:>type in_letter.dat

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screan at

me from dugout because I recealed too much. Now he's

posing in magazine ads in his underwear.

c:>type out_letter.dat

jIM bOTTON, SPORTSCASTER AND AUTHOR OF bALL fOUR, ON

THE RECEPTION TO HIS BOOK : "pETE ROSE WOULD SCREAN AT

ME FROM DUGOUT BECAUSE i RECEALED TOO MUCH. nOW HE'S

POSING IN MAGAZINE ADS IN HIS UNDERWEAR.

 

 

 

[학습 11-1]  

#include <stdio.h>

void main()

     {

          int ch;

          int i=0;

          char string[100];

          printf("\n Input string : ");

          gets(string);

          do {

               ch=string[i];

               if(ch >= 'A' &&ch <='Z')

                    putchar(ch + 32);

               else if(ch >= 'a' &&ch <='z')

                    putchar(ch-32);

               else

                    putchar(ch);

               i++;

           } while(string[i] != '\0');

     }

Input String : This is Sample Text

tHIS IS sAMPLE tEXT  

 

 

[문제 11-2] 레코드 단위 입·출력 함수를 이용하여 봉급을 계산하는 프로그램  

#include <stdio.h>

#include <string.h>

struct{

     char depart[4];

     char name[20];

     int day;

     float pay;

}work_pay;

void main()

     {

          char numstr[20], flag;

          float money=30000;

          FILE *fp;

          if((fp=fopen("work_pay.rec","ab"))==NULL)

          fp=fopen("work_pay.rec","wb");

          do{

               printf("\nEnter department : ");

               gets(work_pay.depart);

               printf("Enter name : ");

               gets(work_pay.name);

               printf("Enter How much day : ");

               gets(numstr);

               work_pay.day=atoi(numstr);

               work_pay.pay=money * (float)work_pay.day;

               printf("\nPayment per day : %f",money);

               printf("\nTotal Payment:%f",work_pay.pay);

               fwrite(&work_pay,sizeof(work_pay),1,fp);

               printf("\n\nContinue (Y/N)...");

               flag=getche();

          }while(flag != 'N' &&flag != 'n');

          fclose(fp);

     }

Enter department : 3

Enter name : Kang jae sik

Enter how much day : 34

 

Payment per day : 30000.00000

Total Payment : 1020000.00000

Continue (Y/N)...

결과는 "work_pay.rec"라는 화일에 2진 정보로 저장된다.

 

 

[문제 11-3] 화일에 있는 문자의 수를 출력  

 #include <stdio.h>

#include <string.h>

void main(int argc, char *argv[])

     {

          FILE *fp;

          char string[81];

          char filename[13];

          int count=0;

          strcpy(filename,argv[1]);

          if(argc != 2) {

               printf("\n Input filename : ");

               gets(filename);

          }

          if((fp=fopen(filename,"r")) == NULL) {

               printf("\n File not found");

               exit(-1);

          }

          while(getc(fp) != EOF)

          count++;

          printf("\n File <%s >contains %d characters",filename,count);

          fclose(fp);

     }

 Input file name : exam.dat

File <exam.dat >contains 444 characters

 

 

[문제 11-4] 임의의 화일을 읽어서 행을 두 배로 확장하는 프로그램  

#include <stdio.h>

#include <string.h>

void main(int argc, char *argv[])

     {

          FILE *in_fp, *out_fp;

          char in_filename[13], out_filename[13];

          strcpy(in_filename,argv[1]);

          strcpy(out_filename,argv[2]);

          if(argc <3) {

               printf("\n Input filename : ");

               gets(in_filename);

               printf(" Output filename : ");

               gets(out_filename);

          }

          in_fp=fopen(in_filename,"r");

          out_fp=fopen(out_filename,"w");

          double_space(in_fp, out_fp);

          fclose(in_fp);

          fclose(out_fp);

     }

double_space(in_p, out_p)

FILE *in_p, *out_p;

     {

          int c;

          while((c=getc(in_p)) != EOF) {

               putc(c,out_p);

               if(c == '\n')

                    putc('\n',out_p);

          }

     }

 Input filename : in.dat

Output filename : out.dat

c:>type in.dat

This is

a

sample

file

c:>type out.dat

This is

a

sample

file 

 

 

[학습 11-2] 화일의 개행문자를 무시하여 화일의 내용을 한 줄로 길게 늘리는 프로그램  

#include <stdio.h>

#include <string.h>

void main(int argc, char *argv[])

     {

          FILE *in_fp, *out_fp;

          char in_filename[13], out_filename[13];

          strcpy(in_filename,argv[1]);

          strcpy(out_filename,argv[2]);

          if(argc <3) {

               printf("\n Input filename : ");

               gets(in_filename);

               printf(" Output filename : ");

               gets(out_filename);

          }

          in_fp=fopen(in_filename,"r");

          out_fp=fopen(out_filename,"w");

          double_space(in_fp, out_fp);

          fclose(in_fp);

          fclose(out_fp);

     }

double_space(in_p, out_p)

FILE *in_p, *out_p;

     {

          int c;

          while((c=getc(in_p)) != EOF) {

               if(c == '\n')

                    putc(' ',out_p);

               else

                    putc(c,out_p);

          }

     }

Input filename : in.dat

Output filename : out.dat

c:>type in.dat

This is

a

sample

file

c:>type out.dat

This is a sample file  

 

 

[문제 11-5] 화일에 'A'부터 'Z'까지의 문자를 저장하고 해당 위치에 있는 문자를 출력  

 #include <stdio.h>

void main()

     {

          FILE *fp;

          int ch;

          int num;

          char filename[13];

          printf("\n Input file name : ");

          gets(filename);

          fp=fopen(filename,"w");

          for(ch='A'; ch<='Z'; ch++)

          putc(ch, fp);

          fclose(fp);

          if((fp=fopen(filename,"r")) == NULL) {

               printf("\n File not found");

               exit(-1);

          }

          printf(" Record Number = ");

          scanf("%d",&num);

          if(fseek(fp,num-1,0) != 0) {

               perror("Can't move pointer there.");

               exit(-1);

          }

          ch=getc(fp);

          printf("\n Record Number : %d character = %c",num,ch);

          fclose(fp);

     }

 Input file name : in.dat

Record number : 5

Record number : 5 character = e

c:>type in.dat

ABCDEFGHIJKLMNOPQRSTUVWXYZ

 

 

[문제 11-6] 화일을 복사하는 프로그램  

#include <stdio.h>

#include <string.h>

void main(int argc, char *argv[])

     {

          FILE *in_fp, *out_fp;

          char in_filename[13], out_filename[13];

          char ch;

          strcpy(in_filename, argv[1]);

          strcpy(out_filename, argv[2]);

          if(argc <3) {

               printf("\n Input file name : ");

               gets(in_filename);

               printf(" Output file name : ");

               gets(out_filename);

          }

          if((in_fp=fopen(in_filename,"r")) == NULL) {

               printf("\n %s file not found");

               exit(-1);

          }

          out_fp=fopen(out_filename,"w");

          while((ch=getc(in_fp)) != EOF)

          putc(ch, out_fp);

          fclose(in_fp);

          fclose(out_fp);

     }

Input file name : letter.dat

Output file name : letter.bak

c:>type letter.dat

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screan at

me from dugout because I recealed too much. Now he's

posing in magazine ads in his underwear.

c:>type letter.bak

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screan at

me from dugout because I recealed too much. Now he's

posing in magazine ads in his underwear.

  

 

 

[학습 11-3] 두 개의 화일을 합병하는 프로그램  

 #include <stdio.h>

#include <string.h>

#define MAX_LINE 80

void main(int argc, char *argv[])

     {

          FILE *in_fp[2], *out_fp;

          int i;

          char ch;

          char temp[MAX_LINE];

          char *in_filename[2],

          out_filename[13];

          strcpy(in_filename[0],argv[1]);

          strcpy(in_filename[1],argv[2]);

          if(argc <3) {

               for(i=0; i<2; i++) {

                    printf("Input %d-st file name : ",i+1);

                    scanf("%s",in_filename[i]);

               }

          }

          for(i=0; i<=1; i++)

          if((in_fp[i]=fopen(in_filename[i],"r")) == NULL) {

               printf("\n %s file not found",in_filename[i]);

               exit(-1);

          }

          printf("\nMerge file name : ");

          scanf("%s",out_filename);

          out_fp=fopen(out_filename,"w");

          for(i=0; i<2; i++) {

               while((ch=getc(in_fp[i])) != EOF)

               putc(ch,out_fp);

          }

          fclose(in_fp[0]);

          fclose(in_fp[1]);

          fclose(out_fp);

     }

Input 1-st file name : in1.dat

Input 2-st file nsme : in2.dat

Merge file name : out.dat

c:>type in1.dat

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screan at

c:>type in2.dat

me from dugout because I recealed too much. Now he's

posing in magazine ads in his underwear.

c:>type out.dat

Jim Botton, sportscaster and author of Ball Four, on

the reception to his book : "Pete rose would screan at

me from dugout because I recealed too much. Now he's

posing in magazine ads in his underwear. 

 

 

[문제 11-7] 화일을 dump하는 프로그램  

#include <stdio.h>

#include <string.h>

void main(int argc, char *argv[])

     {

          FILE *fp;

          int i;

          char ch;

          char buffer[17];

          char filename[13];

          strcpy(filename,argv[1]);

          if(argc <2) {

               printf("\nInput file name : ");

               scanf("%s",filename);

          }

          if((fp=fopen(filename,"r")) == NULL) {

               printf("\n %d file not found",filename);

               exit(-1);

          }

          do {

               for(i=0; i<16; i++) {

                    ch=getc(fp);

                    if(ch == EOF)

                         exit(1);

                    if(ch <31)

                         ch='.';

                    buffer[i]=ch;

                    printf("%3X",ch);

               }

               buffer[i]='\0';

               printf(" %s",buffer);

               putchar('\n');

          } while(1);

          fclose(fp);

     }

Input file name : letter.dat

20 20 20 4A 69 6D 20 42 6F 74 74 6F 6E 2C 20 73 Jim Botton, s

70 6F 72 74 73 63 61 73 74 65 72 20 61 6E 64 20 portscaster and

61 75 74 68 6F 72 20 6F 66 20 42 61 6C 6C 20 46 author of Ball F

6F 75 72 2C 20 6F 6E 2E 20 74 68 65 20 72 65 63 our, on. the rec

65 70 74 69 6F 6E 20 74 6F 20 68 69 73 20 62 6F eption to his bo

6F 6B 20 3A 20 22 50 65 74 65 20 72 6F 73 65 20 ok : "Pete rose

77 6F 75 6C 64 20 73 63 72 65 61 6E 20 61 74 2E would screan at.

20 6D 65 20 66 72 6F 6D 20 64 75 67 6F 75 74 20 me from dugout

62 65 63 61 75 73 65 20 20 49 20 72 65 63 65 61 because I recea

6C 65 64 20 74 6F 6F 20 6D 75 63 68 2E 20 4E 6F led too much. No

77 20 68 65 27 73 2E 20 70 6F 73 69 6E 67 20 69 w he's. posing i

6E 20 6D 61 67 61 7A 69 6E 65 20 61 64 73 20 69 n magazine ads i

6E 20 68 69 73 20 75 6E 64 65 72 77 65 61 72 2E n his underwear.

2E 2E  

 

 

[문제 11-8] sin함수를 화일에 출력하는 프로그램  

#include <stdio.h>

#include <math.h>

void main()

     {

          FILE *fp;

          char filename[13];

          int num,i;

          float x;

          printf("\nOutput file name : ");

          scanf("%s",filename);

          fp=fopen(filename,"w");

          num=16;

          fprintf(fp,"%d",num);

          for(i=0; i<num; i++) {

               x=sin(2*M_PI/num*i);

               fprintf(fp,"\n%f",x);

          }

     }

Output file name : sin.dat

16

0.000000

0.382683

0.707107

0.923880

1.000000

0.923880

0.707107

0.382683

0.000000

-0.382683

-0.707107

-0.923880

-1.000000

-0.923880

-0.707107

-0.382683  

 

 

[학습 11-4] 위에서 구한 화일을 그래프 형식으로 출력하기  

 #include <stdio.h>

#include <math.h>

#define MAX 100

void main()

     {

          int n;

          float x[MAX];

          file_io(&n,x);

          disp(n,x);

          sgraph(n,x);

     }

disp(int num,float array[])

     {

          int i;

          for(i=0; i<num; i++)

          printf("%d\t%f\n",i,array[i]);

     }

sgraph(int num, float array[])

     {

          int i,j,k=39;

          float fmax=0;

          for(i=0; i<num; i++) {

               if(fabs(array[i]>fmax))

               fmax=fabs(array[i]);

          }

          for(i=0; i<num; i++)

               array[i]/=fmax;

          printf("-1");string(k-2,' ');

          printf("0");string(k-2,' ');

          printf("+1\n");printf("+"); string(k-1,'-');

          printf("+"); string(k-1,'-');

          printf("+\n");

          for(i=0; i<num; i++) {

               j=array[i]*k + 0.5 + k;

               if(j>k) {string(k,' ');printf("+");

               string(j-k-1,'-');printf("*\n");

          }

          if(k==j) {

               string(k,' ');

               printf("*\n");

 

          }

          if(j<k) {

               string(j,' ');printf("*");

               string(k-j-1,'-');printf("+\n");

          }

     }

string(int x,char y)

     {

          if(x >0)

          while(x--)

          putchar(y);

     }

file_io(int *num,float array[])

     {

          FILE *fp;

          int i;

          char filename[13];

          printf("\nInput file name : ");

          scanf("%s",filename);

          if((fp=fopen(filename,"r")) == NULL) {

               printf("\n %s file not found",filename);

               exit(-1);

          }

          fscanf(fp,"%d",num);

          for(i=0; i<*num; i++)

          fscanf(fp,"%f",&array[i]);

     }

 Input file name : sin.dat

00.000000

10.382683

20.707107

30.923880

41.000000

50.923880

60.707107

70.382683

80.000000

9-0.382683

10-0.707107

11-0.923880

12-1.000000

13-0.923880

14-0.707107

15-0.382683

-1 0

+1

+--------------------------------------+--------------------------------------+

*

+--------------*

+---------------------------*

+-----------------------------------*

+--------------------------------------*

+-----------------------------------*

+---------------------------*

+--------------*

*

*--------------+

*---------------------------+

*-----------------------------------+

*--------------------------------------+

*-----------------------------------+

*---------------------------+

*--------------+

표 11.5 표준 입․출력 함수표 11.4 랜덤 처리계 함수표 11.3 기준점의 위치표 11.2 화일 접근 모드표 11.1 <stdio.h>화일의 개방 스트림

Posted by 두장