파일의 입출력
C언어는 표준 라이브러리에서 파일 입출력 함수를 제공합니다.
파일 포인터 (FILE*)
C언어에서는 파일 포인터를 이용하여 파일을 읽거나 씁니다.
FILE* fp;
파일 포인터는 다음과 같이 선언합니다.
파일 포인터는 메모장을 열었을 때의 커서의 위치를 나타내는 것과 비슷한 역할을 합니다.
파일 모드
표기법 | 설명 | 포인터 위치 | |
텍스트 파일 | "r" | 읽기 모드로 파일을 엽니다. | 처음 부분 |
"w" | 쓰기 모드로 파일을 엽니다. 파일이 없으면 새로운 파일을 생성하고 파일이 이미 있으면 기존 내용을 모두 지우고 처음부터 씁니다. |
처음 부분 | |
"a" | 추가 모드로 파일을 엽니다. 파일이 없으면 새로운 파일을 생성하고 파일이 이미 있으면 기존 내용의 끝부터 씁니다. |
끝 부분 | |
"r+" | 읽기와 쓰기 모드로 파일을 엽니다. | 처음 부분 | |
"w+" | 읽기와 쓰기 모드로 새로운 파일을 엽니다. | 처음 부분 | |
"a+" | 읽기와 쓰기 모드로 파일을 열고 기존 내용의 끝부터 씁니다. | 끝 부분 | |
아진 파일 | "rb" | 읽기 모드로 이진 파일을 엽니다. | 처음 부분 |
"wb" | 쓰기 모드로 이진 파일을 엽니다. 파일이 없으면 새로운 파일을 생성하고 파일이 이미 있으면 기존 내용을 모두 지우고 처음부터 씁니다. |
처음 부분 | |
"ab" | 추가 모드로 이진 파일을 엽니다. 파일이 없으면 새로운 파일을 생성하고 파일이 이미 있으면 기존 내용의 끝부터 씁니다. |
끝 부분 |
파일 Open & Close
FILE* fp = fopen(location, mode);
// ...
fclose(fp);
파일을 열고 닫기 위해서 fopen과 fclose의 함수를 사용합니다.
fopen
FILE* fp = fopen(location, mode);
fopen은 파일의 위치와 모드를 지정하여 파일을 여는 함수입니다.
파일이 정상적으로 열리면 파일 포인터를, 비정상적으로 열리면 NULL을 반환합니다.
FILE* fp;
if((fp = fopen("text.txt", "w")) == NULL) {
printf("파일을 열지 못했습니다.\n");
} else {
printf("파일을 열었습니다.\n");
}
fclose
fclose(fp);
fclose는 파일을 닫는 함수입니다.
파일이 정상적으로 닫히면 0을, 비정상적으로 닫히면 EOF(Error Of File)을 반환합니다.
FILE* fp = fopen("text.txt", "w");
if (fclose(fp) == EOF) {
printf("파일을 정상적으로 닫지 못했습니다.\n");
} else {
printf("파일을 정상적으로 닫았습니다.\n");
}
문자 입출력
fgetc
char ch = fgetc(fp);
fgetc는 파일의 한 문자를 읽어 char 형태로 반환하는 함수입니다.
파일 포인터는 한 문자 단위만큼 이동시킵니다.
FILE* fp = fopen("text.txt", "r");
char c = fgetc(fp);
fclose(fp);
printf("%c", c);
fputc
fputc(str, fp);
fputc는 한 문자를 쓰는 함수입니다.
FILE* fp = fopen("text.txt", "w");
fputc('가', fp);
fclose(fp);
// text.txt 파일에는 '가'가 저장됩니다.
행 입출력
fgets
fgets(str, size, fp);
fgets는 일정한 크기의 문자열을 읽어 char* 형태로 반환하는 함수입니다.
파일 포인터는 해당 문자열의 끝으로 이동시킵니다.
FILE* fp = fopen("text.txt", "r");
char str[10];
fgets(str, 10, fp); // '\0'까지 포함하여 str에 저장합니다.
fclose(fp);
fputs
fputs(ch, fp);
fputs는 문자열을 쓰는 함수입니다.
FILE* fp = fopen("text.txt", "w");
char str[10] = "text";
fputs(str, fp);
fclose(fp);
블록 입출력
fread
fread(dp, size, block, fp);
fread는 이진 파일 모드에서 파일을 바이트 단위로 읽는 함수입니다.
fwrite
fwrite(dp, size, block, fp);
fwrite는 이진 파일 모드에서 파일에 바이트 단위로 쓰는 함수입니다.
형식 입출력 (fscanf / fprintf)
fscanf
fscanf(fp, format, data1, ...);
fscanf는 파일에서 형식화된 포멧에 맞추어 데이터를 읽는 함수입니다.
파일 포인터를 형식화된 포멧 뒤로 이동시킵니다.
FILE* fp = fopen("text.txt", "r");
char name[10];
int age;
fscanf(fp, "%s %d", name, &age);
fclose(fp);
printf("%s (%d)\n", name, age);
fprintf
fprintf(fp, format, data1, ...);
fscanf는 파일에서 형식화된 포멧에 맞추어 데이터를 읽는 함수입니다.
FILE* fp = fopen("text.txt", "w");
char name[10];
int age;
fprintf(fp, "%s %d", name, age); // text.txt에 name과 age를 저장합니다.
fclose(fp);
파일 임의 접근 (fseek / fgetpos / fsetpos)
fseek
fseek(fp, offset, origin);
fseek는 파일 포인터를 origin 위치에서 offset(바이트)만큼 이동시킨 위치로 이동시키는 함수입니다.
파일 위치 지시자
origin에는 다음과 같은 파일 위치 지시자를 넣을 수 있습니다.
상수 | 값 | 의미 |
SEEK_SET | 0 | 시작 부분 |
SEEK_CUR | 1 | 현재 부분 |
SEEK_END | 2 | 끝 부분 |
FILE* fp = fopen("text.txt", "w");
fseek(fp, 4L, SEEK_SET); // 파일 포인터를 파일의 처음 부분에서 4byte만큼 이동시킵니다.
fclose(fp);
fgetpos
fgetpos(fp, &pos);
fgetpos는 파일 포인터의 현재 위치를 pos 포인터에 저장하는 함수입니다.
정상적으로 완료되면 0을, 그렇지 않으면 0이 아닌 값을 반환합니다.
FILE* fp = fopen("text.txt", "w");
fpos_t pos; // 파일 위치 자료형으로 long 타입을 재정의한 자료형입니다.
fseek(fp, 4L, SEEK_SET);
fgetpos(fp, &pos); // pos에는 4가 저장됩니다.
fclose(fp);
fsetpos
fsetpos(fp, &pos);
fsetpos는 파일 포인터의 위치를 pos 포인터의 위치로 이동시키는 함수입니다.
정상적으로 완료되면 0을, 그렇지 않으면 0이 아닌 값을 반환합니다.
FILE* fp = fopen("text.txt", "w");
fpos_t pos; // 파일 위치 자료형으로 long 타입을 재정의한 자료형입니다.
pos = 300L;
fsetpos(fp, &pos); // 파일 포인터를 300byte의 위치로 이동시킵니다.
fclose(fp);