파일 처리 함수 - 1

자료의 입출력 개념과 파일 입출력의 개념. 파일 포인터와 순차파일.

  • 학습 목표
    1. 파일을 이용한 자료의 입출력 이해.
    2. 파일 입출력의 수행과정 이해.
    3. 파일 포인터를 이용한 자료의 입출력 수행.
    4. 순차파일의 개념 이해.

주요 용어

  • 스트림(stream) : 자료의 입출력을 위한 논리적인 통로.
  • 파일 포인터 : 파일이 어디 있는지를 가리키는 포인터.
  • 순차파일 : 파일의 처음에서부터 자료를 차례로 읽고, 기록하는 파일.
  • 랜덤파일 : 파일의 임의의 위치에서 자료를 읽고, 기록하는 파일.

파일 입출력의 개념

  • 보조기억장치의 파일을 이용한 자료의 입출력.
    • 파일 처리함수를 이용.
    • 표준입출력 -> 키보드나 모니터를 통한 입출력.
  • 파일 처리 함수.
    • 보조기억장치에 들어있는 정보들의 모임을 파일이라 하고, 이러한 파일을 제어하는 함수.

파일

  • 보조기억장치에 저장된 데이터들의 모임.
  • 일련의 byte들로 구성.
  • C 프로그램은 운영체제를 통해서 파일을 읽거나 씀.
  • C 언어에서는 컴퓨터와 연결된 장치들 까지도 모두 파일의 범주에 넣어 처리.

파일 구분

  • 텍스트 파일(text file)
    • 화면에 출력되는 문자들로 구성된 파일.
  • 2진 파일(binary file)
    • 텍스트 파일을 포함한 모든 종류의 자료를 다루는 파일.
    • 컴파일 되어 있어 기계어에 가까우므로 내용을 이해하거나 인쇄 불가능.

파일에 대한 자료의 입출력

  • 파일 입력
    • 디스크 상의 특정 위치(파일)에 수록되어 있는 자료를 읽어들여 기억공간에 수록하는 절차.
  • 파일 출력
    • 기억공간에 있는 자료를 디스크상의 특정위치(파일)에 수록하는 절차.
  • 파일포인터를 사용하여 파일 입출력 수행.

파일처리를 위해서는 파일포인터를 사용

  • 파일포인터
    • 파일이 어디에 있는지를 가리키는 포인터.
    • 모든 파일 입출력 함수는 파일 포인터를 사용

파일을 입출력 할 때 버퍼(buffer) 사용

  • 기억공간과 디스크 사이에 존재하는 임시 기억 공간.
  • 사용
    • 파일 입출력 시 디스크에 저장된 자료를 기억공간으로 읽어 들일 때.
    • 기억 공간에서 처리된 자료를 디스크에 저장할 때.

파일포인터를 이용한 파일 입출력

자료의 입출력 개념

  • 프로그램과 입출력 장치(콘솔, 파일, 소켓등)와의 사잉에 이루어 지는 자료의 입력과 출력.
  • 자료의 입출력을 위한 논리넉인 통로 : 스트림

스트림 (stream)

stream

  • 표준 입출력장치를 이용한 자료 입출력.
    • 표준 입출력장치와의 스트림은 프로그램 실행/종료 시
      자동으로 생성/소멸 됨.
  • 파일 입출력을 위한 스트림은 프로그램을 통해 생성/소멸 시켜주어야 함.

파일 입출력의 수행 과정

  • 과정

    1. 파일을 연다.
      • 파일과 자료를 주고 받을 수 있는 스트림을 생성(fopen() 사용).
    2. 입출력을 수행한다.
    3. 파일을 닫는다.
  • 생성된 스트림을 소멸시키기 위한 과정(fclose() 사용).

스트림(stream)의 생성

  • 파일과 프로그램과의 통로(논리적인 접속)를 구성.
  • 통로 역할을 파일포인터가 수행.

파일입출력 프로그램 구조

  // 파일을 가리키는 파일포인터 선언.
  FILE *fp;

  //  파일 열기 : 지정한 모드로 열고, fp로 하여금 파일을 가리키게 함.
  fp = fopen("파일명", "모드");

  //  입출력 수행 : 파일처리함수와 fp를 이용하여 입출력 수행.
  ...

  //  파일 닫기 : 버퍼를 비우고 fp가 가리키는 파일을 닫음.
  fclose(fp);
  #include <stdio.h>

  void main() {
    char ch;
    FILE *fp;
    fp = fopen("file_IO_test.txt", "W");
    for (ch = 'A'; ch <= 'Z'; ch++)
      fputc(ch, fp);

    fclose(fp);
  }

파일처리 함수와 기능

function desc
fopen("filename", "mode") 파일을 지정된 모드로 열기
fclose() 파일 닫기
fget(), getc() 파일로부터 한 문자 읽기
fputc(), putc() 파일에 한 문자 쓰기
fgets() 파일로부터 문자열 읽기
fputs() 파일에 문자열 쓰기
fscanf() 파일로 부터 정해진 형식에 따라 읽기
fprintf() 파일에 정해진 형식에 따라 쓰기
fread() 파일로부터 정해진 크기의 자료를 정해진 개수만큼 읽기
fwrite() 파일에 정해진 크기의 자료를 정해진 개수만큼 쓰기
fseek() 파일에서 입출력 위치 이동
feof() 파일의 끝인가를 판별
ferror() 파일의 입출력 시 에러 발생 유무 조사

파일포인터 선언과 파일 열기

파일포인터 선언

  • 파일 입출력을 위해 파일포인터 선언.
  • 실제 파일과 프로그램을 연결해주는 통로가 됨.
  • 형식 : FILE *변수명;
  • 사용 예 : FILE *fp;
  • 기능 : 파일형 포인터변수를 선언.

파일포인터 변수와 버퍼의 관계

  • FILE형 : 구조체형.
  • FILE형 포인터 변수 : 파일에 대한 여러가지 정보를 가진 변수.

file 형 포인터 변수

 

파일 열기 : fopen()

프로그램과 디스크 상의 파일 사이에 데이터가 입출력할 수 있도록 통로를 만들어 주는 것.

  • 형식 : fopen("파일명", "사용모드");
  • 사용 예 : fp = fopen("test.dat", "r");
  • 기능 : 파일을 열어 사용할 수 있게 함.
  • 입출력이 정상이면 지정된 파일의 파일포인터에 시작주소 값을 리턴.
  • 파일이 개방되지 않을 때는 에러 값(NULL값) 리턴.
  • 파일 명
    • 경로를 포함 할수도 안 할 수도 있다?
  • 사용 모드
    • 개방한 파일의 용도를 결정.
    • 자료의 입출력 방식을 의미
    • 사용(개방)모드 = 파일 접근 모드 + 데이터 입출력 모드.
      • r, r+ : 읽기
      • w, w+ : 쓰기
      • a, a+ : 추가
      • t : 텍스트 모드(text mode)
        • 기본 값.
        • 프로그램에서 파일로 자료를 입출력할 때 변환이 일어나는 입출력 모드.
        • 문자 변환이 필요(\n -> CR/LF).
      • b : 2진 모드(bianry mode)
        • 변환이 일어나지 않는 입출력 모드.
        • 문자 변환 불필요.
사용 모드 의미 파일이 있을 경우 파일이 없을 경우
r, rb 읽기 정상처리 NULL
r+, rb+ 읽기/쓰기 정상처리 NULL
w, wb 쓰기 이전 내용 삭제 새 파일 생성
w+, wb+ 읽기/쓰기 이전 내용 삭제 새 파일 생성
a, ab 추가 이전 내용 뒤에 추가 새 파일 생성
a+, ab+ 읽기/추가 이전 내용 뒤에 추가 새 파일 생성
  fopen("filename", "w") //  텍스트 출력 모드
  fopen("filename", "rt") //  텍스트 입력 모드
  fopen("filename", "wb") //  2진 출력 모드
  fopen("filename", "rb+") //  2인 입력 모드

파일 닫기 fclose()

  • 형식 : fclose(파일포인터 변수);
  • 사용 예 : fclose(fp);
  • 기능 : 열었던 파일을 닫고, fp 해제.
  • 개방된 통로와 버퍼를 원 상태로 환원.
  • 쓰기의 경우 파일 끝에 EOF(End Of File) 신호 부가(완전한 파일로 완성됨).

파일 열기와 닫기 사용 예

  FILE *fp1, fp2;
  //  a파일을 쓰기용으로 열어 그 시작주소를 파일포인터 fp1에게 부여.
  fp1 = fopen("a", "w");
  fp2 = fopen("b", "r");

  //  파일 open이 안된 경우 종료 해야 함.
  if( (fp = fopen("filename", "r") ) == NULL ) {
    exit(1);  //  프로그램 종료
  }

  //  열었던 파일을 닫고 파일포인터 해제.
  fclose(fp1);
  fclose(fp2);

순차파일처리

정보의 집합 => 파일 => 레코드 단위 구성

  • 레코드
    • 파일 입출력 처리에 사용되는 논리적인 기본 단위.
    • 각 레코드들은 필드(field)들로 구성.

파일 처리 함수를 이용하여 파일을 편성하는 방법에 따라 순차파일, 랜덤파일로 구분.

파일의 종류

순차 파일 (sequential file)

  • 파일의 처음부터 자료를 차례로 읽고, 기록하는 파일.
  • 레코드의 길이가 일정하지 않은 파일.

랜덤 파일 (random file)

  • 파일의 임의의 위치에서 자료를 읽고, 기록하는 파일.
  • 레코드의 길이가 일정한 파일.

순차파일에서 레코드 구성

순차파일은 레코드의 길이가 일정하지 않기 때문에 레코드들의 구분이 필요 : CR/LF를 사용하여 구뷴

 

순차파일 출력함수

만들어진 파일에 자료를 기록하는 함수.

  • putc(), fputc(), fputs(), fprintf()
  • 순차파일 출력함수
    • getc(), fgetc(), fgets(), fscanf()

728x90
반응형

'Language > C' 카테고리의 다른 글

[C] 메모리 동적 할당  (0) 2021.01.03
[C] 파일 처리 함수 - 2  (0) 2021.01.02
[C] 구조체와 공용체 - 2  (0) 2021.01.01
[C] 구조체와 공용체 -1  (0) 2020.12.27
[C] 배열과 포인터 - 3  (0) 2020.12.27

입출력 함수와 연산자 - 1

함수의 기본 개념, 표준 입출력 함수의 종류와 사용법.
입출력 양식 변환 기호.

  • 학습 목표

    1. C 언어에서의 함수를 이해.
    2. 표준 입출력 함수의 사용.
    3. 입출력 양식 변환 기호 사용..
  • 주요 용어

    • 함수 : 특정한 작업(기능)을 수행하도록 설계된 독립적인 프로그램.
    • 표준 함수 : C 언어 자체적으로 제공하는 함수.
    • 사용자 정의 함수 : 사용자가 정의하여 사용하는 함수.
    • 표준 입출력함수 : 자료의 입출력을 위해 C 언어에서 제공하는 함수.

 


 

표준 입출력 함수

함수 : 특정한 작업(기능)을 수행하도록 설계된 독립적인 프로그램.

 

C언어에서의 함수

  • 표준 함수 : C 언어 자체에서 제공하는 함수.
  • 사용자 정의 함수 : 사용자가 정의하여 사용하는 함수.

 

표준 입출력 함수의 종류

 

표준 출력함수 기능
printf() 화면에 여러 종류의 자료를 출력
putchar() 화면에 1개의 문자를 출력
puts() 화면에 문자열 출력

 

표준 입력함수 기능
scanf() 키보드를 통해 여러 종류의 자료를 입력 받음
getchar() '' 1개의 문자를 입력
gets() '' 문자열 출력

 


 

표준 출력 함수

출력양식 변환 기호

%문자 변환 형식 인자의 자료형
%d 부호 있는 10진 정수 정수형, 문자형
%u 부호 없는 10진 정수 정수형, 문자형
%f 부동소수점형식 실수형
%e, %E 지수 형태 실수형
%c 한 문자 정수형, 문자형
%s 문자열 문자열 포인터
%o 부호 없는 8진수 정수형, 문자형
%x, %X 부호 없는 16진수 정수형, 문자형

 

  #include <stdio.h>
  int main()
  {
    // 양식 변환 기호의 사용 예
    printf("%c\n", 'a');        //  a
    printf("%d\n", -123);       //  -123
    printf("%o\n", 123);        //  173
    printf("%x\n", 123);        //  7b
    printf("%X\n", 123);        //  7B
    printf("%f\n", 123.456789); //  123.456789
    printf("%e\n", 123.456789); //  1.234568e+02
    printf("%s\n", "asdf");     //  asdf

    printf("|%d|\n", 123);        // |123|      -> 숫자의 길이만큼 출력 폭이 자동 지정 됨.
    printf("|%5d|\n", 123);       // |  123|    -> 총 5자리 오른쪽 정렬.
    printf("|%-5d|\n", 123);      // |123  |    -> 총 5자리 왼쪽 정렬.
    printf("|%05d|\n", 123);      // |00123|    -> 총 5자리 공백은 0 오른쪽 정렬.
    printf("|%6.1f|\n", 123.45);  // | 123.5|   -> 소숫점 포함 총 6자리, 소수점 이하 1자리 출력
    printf("|%07.2f|\n", 123.45); // |0123.45|  -> 소숫첨 포함 총 7자리, 소수점 이하 2자리 출력, 공백은 0

    return 0;
  }

 

 

printf()

  • 형식 : printf("출력 양식", 변수1, 변수2, ..);
  • 기능 : 주어 진 출력양식으로 자료를 출력한다.
  • 사용 예
    • printf("This is an example\n");
    • printf("A=%d, B=%c\n", a, b);

 

  #include <stdio.h>

  int main()
  {
    char c = 'A';
    int i = 10, j = 20, k = 30;

    printf("simple print program\n");
    printf("c = %c, c\'s ASCII CODE : %d\n", c, c);
    printf("i = %d, j = %d, k = %d\n", i, j, k);

    return 0;
  }

 

 

putchar()

  • 형식 : putchar();
  • 기능 : 한 문자를 출력.
  • 사용 예
    • putchar('A');

 

  #include <stdio.h>

  int main()
  {
    char c = 'C';

    putchar(c);
    putchar(c + 1);   // 수식이 사용 됨.
    putchar('\n');    //  개항.
    putchar('E');     //  문자형 상수.
    putchar('E' + 2); // 수식 실행.
    putchar('\007');

    return 0;
  }

 

 

puts()

  • 형식 : puts(변수);
  • 기능 : 문자열을 입력 받음.
  • 사용 예
    • char s[50] = "Jeaha";
    • puts(s);

 

#include <stdio.h>

int main()
{
  char s1[] = "Jeaha In ";
  char s2[] = "The C Hell.";

  puts(s1);
  puts(s2); //  \n을 사용하지 않아도 자동으로 줄바꿈이 됨.

  printf("%s", s1);
  printf("%s\n", s2); //  \n을 사용하지 않아서 문자열이 연결되어 출력 됨.
  return 0;
}

 


 

표준 입력 함수

입력 양식 변환 기호

%문자 변환 기능
%d 정수
%ld long
%f 실수형
%lf double 실수형
%c 문자형
%s 문자열

 

scanf()

  • 형식 : scanf("입력 양식", &변수1, &변수2, ..);
  • 기능 : 주어진 양식으로 자료를 입력받아 지정된 변수에 저장.
  • 사용 예
    • scanf("%d", &d);

 

  #include <stdio.h>
  // 권장하지 않은 함수에 대한 경고 무시 요청.
  #pragma warning(disable : 4996)
  int main()
  {
    int i1, i2;
    float j1, j2;

    printf("\n>>> insert integer : ");
    scanf("%d %d", &i1, &i2);

    printf("\n>>> insert float or double : ");
    scanf("%f %f", &j1, &j2);

    printf("\n--------------------------------\n");
    printf("\nint\n\t1 : %d\n\t2 : %d\n", i1, i2);
    printf("\nfloat\n\t1 : %f\n\t2 : %f\n", j1, j2);

    return 0;
  }

 

 

getchar()

  • 형식 : getchar();
  • 기능 : 한 문자를 입력받아 지정된 변수에 저장.
  • 사용 예
    • a=getchar();

 

#include <stdio.h>

int main()
{
  char a;

  printf("\ninsert one char : ");
  a = getchar();
  printf("a = %c\n", a);

  return 0;
}

 

 

gets()

  • 형식 : gets();
  • 기능 : 문자열을 입력 받음.
  • 사용 예
    • char s[50];
    • gets(s);

 

  #include <stdio.h>
  #pragma warning(disable : 4996)
  int main()
  {
    char s[50];
    printf("\ninsert string : ");
    gets(s);

    printf("string inserted by gets() : %s\n", s);

    printf("\ninsert string : ");
    scanf("%s", s); //  공백 문자로 문자를 구분하기 때문에, 공백이 생기면 n개의 문자열로 인식함.
    printf("string inserted by scanf() : %s\n", s);

    return 0;
  }

 

728x90
반응형

'Language > C' 카테고리의 다른 글

[C] 함수와 기억 클래스 - 1  (0) 2020.12.20
[C] 선택 제어문과 반복 제어문  (0) 2020.12.20
[C] 입출력 함수와 연산자 - 2  (0) 2020.12.20
[C] 자료형과 선행 처리기  (0) 2020.12.14
[C] C 언어의 개요  (0) 2020.12.13

+ Recent posts