C | C++/Basic

[C] 파일 입출력

HYEOKJUN 2022. 11. 4. 18:00
반응형


파일의 입출력

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);

 

 

반응형