728x90

파일(file)

  • 일련의 연속된 바이트(byte)
  • 모든 파일 데이터들은 결국 바이트로 바뀌어서 파일에 저장된다.
  • 바이트들을 어떻게 해석하느냐에 따라 파일의 내용이 달라진다.

 

이진 파일(binary file)

  • 이진 파일은 사람이 읽을 수 없으나 컴퓨터는 읽을 수 있는 파일
  • 이진 데이터가 직접 저장되어있는 파일
  • 이진 파일은 텍스트 파일과 달리 라인들로 분리되지 않는다.
  • 이진 파일은 특정 프로그램에 의해서만 판독가능하다.└ EX. 실행 파일, 사운드 파일, 이미지 파일

 

파일 처리

  • 디스크 파일은 FILE 구조체를 이용하여 접근
  • FILE 구조체를 가리키는 포인터를 파일 포인터(file pointer) 라고 한다.

 

파일 열기

  • 파일 모드 : 파일을 열어 수행할 작업 명시

파일 모드

💡 추가 모드(append mode) - 추가 모드로 파일이 열리면, 모든 쓰기 동작은 파일의 끝에서 발생한다. └ (원래 파일에 있던 기존의 데이터는 지워지지 않는다.)

 

💡 수정 모드(update mode) r+ , w+ , a+ 파일 모드 지정시, 읽고 쓰기 모두 가능

 

📢 읽기 모드에서 쓰기 모드로, 쓰기 모드에서 읽기 모드로 전환 시에는 fflush() , fsetpos() , fseek() , rewind() 중 하나를 반드시 호출해야 한다.

 

Ex1. 파일 열기
#include <stdio.h>

void main(void) 
{
	FILE *fp = NULL;

	fp = fopen("sample.txt", "w");
	if( fp == NULL )
		printf("파일 열기 실패\n");
	else 
		printf("파일 열기 성공\n");
 
	fclose(fp);
}

  • 파일이 존재하지 않으면 새로 생성한다.

 

파일 닫기와 삭제

  • 파일 사용 후에는 꼭 닫아 주어야한다.
  • 파일 포인터를 사용 상태로 종료하면 다음 이용이 불가하다.

 

파일 입출력

파일 입출력 함수

└ 텍스트 입출력 함수와 이진 데이터 입출력 함수로 나뉜다.

 

Ex2. 문자 단위 출력
#include <stdio.h>
void main(void)
{
	FILE *fp = NULL;

	fp = fopen("sample.txt", "w");
	if (fp == NULL)
		printf("파일 열기 실패\n");
	else
		printf("파일 열기 성공\n");

	fputc('a', fp);
	fputc('b', fp);
	fputc('c', fp);
	fclose(fp);
}

 

  • sample.txt 파일 내용 출력 시

 

Ex3. 문자열 단위 입출력
#include <stdio.h>
#include <stdlib.h>
 
void main(void) {
  FILE *fp1, *fp2;
  char file1[100], file2[100]; // 파일 포인터 두개 사용
  char buffer[100];
 
  printf("원본 파일 이름:  ");	scanf("%s", file1);	
  printf("복사 파일 이름:  ");	scanf("%s", file2);	
  if( (fp1 = fopen(file1, "r")) == NULL ) {   // 첫번째 파일을 읽기 모드로 연다.
       fprintf(stderr,"원본 파일 %s을 열 수 없습니다.\n", file1);
       exit(1);
  }
  if( (fp2 = fopen(file2, "w")) == NULL ) {  // 두번째 파일을 쓰기 모드로 연다.
       fprintf(stderr,"복사 파일 %s을 열 수 없습니다.\n", file2);
       exit(1);
  }
 
  while( fgets(buffer, 100, fp1) != NULL ) {  // 첫번째 파일을 두번째 파일로 복사한다.
       fputs(buffer, fp2); 
  }
 
  fclose(fp1);
  fclose(fp2);
}
  • 원본 파일 및 복사 파일이 없는 경우

└ 비정상적 종료 발생!

 

  • 원본 파일 및 복사 파일이 있는 경우

 

형식화된 입출력

  • fprintf : 서식을 지정하여 파일에 문자열을 쓴다.
  • fscanf : 서식을 지정하여 파일에서 문자열을 읽는다.

 

이진 파일 읽기와 쓰기

텍스트 파일과 이진 파일의 차이

  • 텍스트 파일 (text file) : 모든 데이터가 아스키 코드로 변환되어 저장 (문자열 형태)
  • 이진 파일(binary file) : 컴퓨터에서 데이터를 표현하는 방식 그대로 저장 (이진수 형태)

 

이진 파일 쓰기

  • fwrite(버퍼, 쓰기크기, 쓰기횟수, 파일포인터);

 

이진 파일 모드

 

이진 파일 읽기

  • fread(버퍼, 읽기크기, 읽기횟수, 파일포인터);

 

fflush(fp)

: 버퍼의 내용이 디스크 파일에 써진다.

setbuf(fp, NULL)

: 스트림의 버퍼를 직접 지정하는 함수로서, 만약 버퍼 자리에 NULL을 써주면 버퍼 제거를 의미

 

파일 접근 방식

  • 순차 접근(sequential access): 데이터를 파일의 처음부터 순차적으로 읽거나 기록하는 방법
  • 임의 접근(random access): 파일의 어느 위치에서든지 읽기와 쓰기가 가능한 방법

 

fseek()

  • 파일 내에서 특정한 위치로 이동할 때 사용
  • fseed(파일포인터, 이동할 거리, 이동 방식);
    • 기준 위치 표

 

Ex4
#include <stdio.h>

void main (void) {
  FILE *fp;

  char buffer[100];

  fp = fopen("sample.txt", "wt");       
  fputs( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" , fp );
  fclose(fp);

  fp = fopen("sample.txt", "rt");       

  fseek( fp , 3 , SEEK_SET );	printf("fseek(fp, 3, SEEK_SET) = %c \n",    fgetc(fp));
  fseek( fp , -1 , SEEK_END );	printf("fseek(fp, -1, SEEK_END) = %c \n",  fgetc(fp));
	// SEEK_END 는 파일의 맨 끝을 가리키므로 맨 마지막 문자를 출력하려면 -1을 해주어야 한다.

  fclose(fp);
}

 

ftell()

  • 현재 위치의 위치 값을 알고 싶을 때 사용

 

 


 

 

 

파일 입출력

파일(file)

www.notion.so

 

아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!

수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑

 

 

 

C 언어 이론 정리

조건문, 반복문 사용 시 중괄호로 명령문들 묶어주기 - 명령문 1개일 때 포함 (코드 수정 시 오류 방지)

www.notion.so

 


 

개발 환경

Visual Studio 2019
Visual Studio Code

작성 플랫폼

Notion

 

728x90

'🧑‍💻 Language > C·C++' 카테고리의 다른 글

[C++] 시스템 소프트웨어 개발  (1) 2022.05.20
[C 이론] 17. 구조체  (0) 2021.06.23
[C 이론] 15. 표준 입출력  (0) 2021.06.22
[C 이론] 14. 문자와 문자열(2)  (0) 2021.06.05
[C 이론] 13. 문자와 문자열(1)  (0) 2021.06.05