본문 바로가기

컴퓨터/언어,프로그래밍

[C언어] C언어 파일의 활용

C 프로그래밍


<파일의 개념과 활용>


1. 개 요

파일(file)을 추상적으로 설명하면 순차적으로 처리되는 문자들의 스트림으로 생각할 수 있다. 시스템에서 제공하는 표준 파일로는 stdin(표준 입력파일), stdout(표준 출력파일), stderr(표준 오류파일), 그리고 stdio(표준 입출력파일)이 있다.

또한 라이브러리 함수 fopen()은 파일을 열기 위해서 사용되는데 이것은 FILE에 대한 포인터를 반환한다. 다음은  my_file이란 파일을 오픈시키기 위해 사용되는 프로그램을 보기로 하자.

    #include <stdio.h>

    main()

    {

    int      c;

        FILE    *fp, fopen();

        fp = fopen("my_file", "r");

        ․․․․․

  함수 main()의 본체에서 두 번째 라인은 파일에 대한 포인터 fp를 선언하고, 함수 fopen()이 파일에 대한 포인터를 반환하도록 선언한 것이다. 함수 fopen()은 표준 라이브러리이다. 파일은 표준헤더파일 stdio.h안에 특별한 구조로써 기호로 정의되어 있다. 그 구조를 사용하기 위해서 사용자는 자세한 사항을 알 필요가 없다. 그러나 헤더파일은 파일을 참조하기 전에 #include에 의하여 이용 가능하게끔 되어 있어야 한다. 함수 fopen()은 인수로써 두 문자열을 가진다. 그리고 파일에 대한 포인터를 반환한다. 첫 번재 인수는 파일이름이고 두 번째 인수는 파일이 오픈된 형식이다.

                                         파일의 세 가지 형식

 

  “r"    판독(read) 

  "w"   기록(write) 

  "a"    첨가(append) 

 

  파일이 기록을 하기 오픈되었을 때 내용이 존재하지 않으며 새로 생성된다. 만일 이미 존재하고 있으면 내용이 지워지고 파일의 처음부터 기록된다. 여러 가지 이유로 파일이 액세스될 수 없다면 포인터값 널이 fopen()에 의해 반환된다.

  파일이 오픈된 후로는 파일에 대한 모든 참조는 파일 포인터를 통하여 이루어진다. 프로그램의 실행이 끝나면 시스템은 자동적으로 오픈된 모든 파일들을 닫는다. 대부분 시스템은 전형적으로 20개 정도의 파일만을 동시에 오픈할 수 있다. 많은 파일을 사용할 때 현재 사용되진 않는 파일을 명시적으로 닫는 것은 중요한 것이다. 표준 라이브러리 함수 fclose()는 파일들을 닫는데 사용된다.

  텍스트에서 단어와 문자의 발생빈도를 분석하는 것은 쉬운 일 중의 하나이다.

이것은 프로그램 훈련에 유용하게 쓰인다. 간단하게 대문자의 개수를 세는 프로그램을 작성해 보자. 이 장에서 만든 현재 버전의 파일을 chapter1이라 하고, 이 파일 위에서 분석을 해보자.

    #include    <stdio.h>

    main()

    {

    int      c, i, letter[26];

        FILE    *fp, *fopen();

        fp = fopen("chapter1", "r");

        for(i = 0; i < 26; ++i)    /* 배열을 0으로 초기화 */

        letter[i] = 0;

        while((c = getc(fp)) != EOF)

    if('A' <= c && c <= 'Z')

        ++letter[c - 'A'];

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

    if(i % 6 == 0)

        printf("\n");

        printf("%5c:%5d", 'A' + i3, letter[i]);

        }

        printf("\n\n");

    }

  이 프로그램의 결과는 다음과 같다. 

    A:  153   B:  179   C:  240   D:   47   E:  249   F:   55

    G:    7   H:   17    I:  370   J:    1   K:    2   L:  140

    M:   32   N:   59   O:   61   P:  366   Q:    4   R:   44

    S:   98   T:  262   U:   26   V:    7   W:   44   X:   17

    Y:    4   Z:    7

  많은 문자들의 상대빈도는 보통의 텍스트에서 찾아지는 것과 다르다는 것에 유념한다.


2. 명령라인에 인수의 사용 

  C 언어는 프로그램을 활성화시키는 명령라인에 인수를 접목시키는 기능을 제공한다. 전형적으로 연결하여 사용하기 위해서 다음과 같이 작성한다.

    main(argc. argv)

    int    argc;

    char  *argv[];

    {

      ․․․․․

  인수 argc는 인수의 개수(argument count)를 뜻하고, 그 값은 프로그램을 실행시키기 위해 사용된 명령라인의 인수계수이다. 인수 argv는 인수변수(argument varible)를 뜻한다. 이것은 char(문자열의 배열)에 대한 포인터 배열이고, 명령라인의 연속적인 단어들을 가리키는 배열의 연속적인 원소는 프로그램을 실행시키기 위해서 사용된다. 따라서 argv[0]은 명령 자체의 이름을 가리킨다.

  이 기능이 어떻게 이용되는지 예를 보이기 위해 위의 프로그램을 수정해서 컴파일하고 실행가능 코드를 파일 letters에 기록해 놓았다고 하자.

  명령라인

    letters chapter1 outfile

는 두 개의 파일 chapter1output을 매개변수로 하여 프로그램 letters를 실행 시킬 것이다. 이 프로그램은 파일 chapter1에서 읽고, 파일 outfile에 쓰게 될 것이다. 만일 다른 명령

    letters chapter2 temp

를 쓰게 되면 프로그램은 파일 chapter2를 읽고 파일 temp에 쓰는 된다.

이것을 수행하는 프로그램은 다음과 같다.

    #include     <stdio.h>

    main(argc, argv)

    int      argc;

    char    *argv[];

    {

    int     c, i, letter[26];

        FILE   *ifp, *ofp, *fopen();

    if(argc != 3)

            printf("\nusage: %s infile outfile \n\n", argv[0]);

        else {

            ifp = fopen(argv[1], "r");

            ofp = fopen(argv[2], "w");

            for(i = 0; i < 26; ++i)    /* 배열을 0으로 초기화 */

               letter[i] = 0;

            while((c = getc(ifp)) != EOF)

           if('A' <= c && c <= 'Z')

                  ++letter[c - 'A'];

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

           if(i % 6 == 0)

               fprintf("ofp, "\n");

                fprintf(ofp, "%5c:%5d", 'A' + i, letter[i]);

            }

                fprintf(ofp, "\n\n");

            }

         }

    


3. 프로그램 letters의 분석


위에서 작성한 프로그램을 하나하나 분석해 보기로 하자.


    FILE    *ifp, *ofp, fopen();

  식별자 ifp와 ofp는 종종 ‘infile 포인터’ 와 ‘outfile 포인터’를 나타내는 것으로 서 사용한다.

     if(argc != 3)

    printf("\nusage: %s infile outfile\n\n", argv[0]);

  만일 명령라인상의 단어수가 3이 아니면, 프로그램은 옳지 않게 실행된 것이다. 명령라인

    letters chapter1 abc abc

이 타자되었다고 가정해 보자. 이 라인은 네 개의 단어로 이루어졌기 때문에 argc는 값 4를 갖고 다음과 같은 메시지가 화면에 나타나게 한다.

    usage:  letters  infile  outfile

또한 정상적으로 아래의 두 문장을 실행시키기 위해서 letters chapter1 outfile를 입력했다고 하자.

    ifp = fopen(argv[1], "r");

    ofp = fopen(argv[2], "w");

  그러면 argv[0]은 문자열 “letters"를 가리키고, argv[1]은 문자열 ”chapter1"을 가리키며, argv[2]는 문자열 “outfile"를 가리키게 된다. 따라서 파일 chapter1은 파일 포인터 ifp로써 판독용으로 오픈되었고, 파일 outfile은 파일 포인터 ofp로써 기록용으로 오픈되었다.

    while(( c = getc(ifp)) != EOF)

  함수 getc()는 표준 라이브러리로 제공된다. 이것은 파일에 대한 포인터를 인수로 가진다는 것을 제외하고는 getchar()와 비슷하다. 함수가 호출될 때, 그것은 파일에서 다음 문자를 얻는다.

    fprintf(ofp, "%5c:%5d", 'A' + i, letter[i]);

  함수 fprintf()는 표준 라이브러리로 제공된다. 함수 fprintf()는 파일에 대한 포인터를 인수로 가진다는 것을 제외하고는 fprintf()와 비슷하다. 이 함수가 호출되면 화면이 아니라 지정된 파일에 출력된다.


제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...