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()
- 현재 위치의 위치 값을 알고 싶을 때 사용
아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!
수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑
개발 환경
작성 플랫폼
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 |