C언어의 코드를 작성 후 실행해서 나온 결과는 결국 실행을 종료하면 사라지게 됩니다.
그래서 결과를 저장하는 방법 중 하나인 파일 입출력에 대해서 알아보겠습니다.
fopen()
먼저 파일을 열거나 새로 만들기 위해서 사용하는 함수의 원형은 다음과 같습니다.
FILE *fopen(const char *name, const char *mode)
fopen은 파일의 정보를 FILE 포인터로 반환합니다. (FILE은 stdio.h에 선언되어있는 구조체 자료형입니다.)
파일을 열 때 실패하면 NULL을 반환합니다.
const char *name는 파일의 경로입니다.
파일 이름만 적게 되면 현재 프로젝트가 저장된 경로가 기본으로 지정됩니다.
특정 파일을 찾아서 열고 싶다면 파일 경로를 직접 입력하면 됩니다.
ex) "D:\\Test\\test.txt"
const char *mode은 파일 처리 방식입니다.
기본적으로 파일 처리 방식은 문자열로 표시합니다.
만약 쓰기모드에 텍스트 파일 타입이면 "w"만 적어주면 됩니다.
하지만 바이너리 파일은 "wb" "wb+" 로 입력해야 합니다.
읽기 쓰기가 동시에 가능한 +는 그냥 사용하면 이상한 값이 나올 수 있습니다.
그래서 rewind(), fseek() 등을 호출해서 파일 위치 지정자(커서의 위치)를 다시 해야 합니다.
대표적인 rewind()와 fseek()만 짧게 알아보면
rewind(FILE *stream)
int fseek(FILE* stream, long int offset, int origin);
rewind는 파일의 위치 지정자를 맨 처음으로 설정합니다.
fseek는 파일의 위치 지정자를 원하는 위치에 설정할 수 있습니다.
origin은 파일 위치 지정자의 시작 위치입니다.
매크로 상수인 SEEK_SET(처음 시작), SEEK_CUR(현재위치), SEEK_END(끝)의 매크로를 입력 가능합니다.
offset은 orgin에서 얼마나 이동할지의 값을 입력합니다. 바이트 단위로 움직임으로 영어는 한 단어입니다.
fclose()
fopen()으로 연 파일을 닫아줍니다.
읽기, 쓰기를 수행 후 마지막에 사용합니다.
이제 데이터를 입출력하는 함수를 알아보겠습니다.
fputc(), fgetc()
각각 함수원형은 다음과 같습니다.
int fputc(int c, FILE* stream);
int fgetc(FILE* stream);
문자 단위로 파일에 입력과 출력이 가능합니다.
현재 표시자의 위치에 입력과 출력을 하며 한 문자를 입력하거나 출력하게 되면 표시자가 한 칸 증가합니다.
#include <stdio.h>
int main(void) {
FILE* fp;
fp = fopen("test.txt", "w+");
char value;
if (fp == NULL) {
printf("파일없음 \n");
}
else {
printf("파일있음 \n");
fputc('c', fp);
rewind(fp);
value = fgetc(fp);
printf("%c \n", value);
fclose(fp);
}
return 0;
}
fgets(), fputs()
각각 함수원형은 다음과 같습니다.
int fputs(const char* str, FILE* stream);
char* fgets(char* str, int num, FILE* stream);
문자열 단위로 파일에 입력과 출력이 가능합니다.
#include <stdio.h>
int main(void) {
FILE* fp;
fp = fopen("test.txt", "w+");
char value[20];
fputs("hello world", fp);
fseek(fp, 0, SEEK_SET);
fgets(value, 20, fp);
printf("%s \n", value);
fclose(fp);
return 0;
}
fprintf(), fscanf()
각각 함수 원형은 다음과 같습니다.
int fprintf(FILE* stream, char const * const _Format, ...)
int fscanf(FILE* stream, char const * const _Format, ...)
파일에 입력과 출력을 형식에 맞춰서 읽어 옵니다.
기본 형식은 printf와 scanf와 유사합니다.
#include <stdio.h>
int main(void) {
FILE* fp;
fp = fopen("test.txt", "w+");
int num;
fprintf(fp, "a = %d", 1);
fseek(fp, 4, SEEK_SET); //처음에서 4바이트 이동
fscanf(fp, "%d", &num);
printf("%d \n", num);
fclose(fp);
return 0;
}
remove()
remove(FILE* stream)
파일을 삭제 합니다.
'공부 자료실 > C언어' 카테고리의 다른 글
C언어 - 동적 메모리 할당 (0) | 2020.08.07 |
---|---|
C언어 - #if, #elif, #else, #endif 와 ifdef, #ifndef, #endif 지시문 (1) | 2020.07.22 |
C언어 - 내장 매크로 (0) | 2020.07.21 |
C언어 - #define (0) | 2020.07.04 |
C언어 - void 포인터 (0) | 2020.07.03 |
댓글