[C언어] 16. 파일 입출력
파일 입출력
프로그램에서 활용하는 데이터는 프로그램이 종료되면 다시 사용할 수 없습니다.
이 데이터들은 저장이 되지 않는 휘발성 데이터이기 때문이죠.
데이터를 프로그램이 종료되어도 유지시키고 싶은 경우엔 파일에 저장하여 활용할 수 있습니다.
이때 활용하는 방식이 파일 입출력 입니다.
파일 입출력을 위해서는 위 3가지 단계를 거쳐야 합니다.
수정 가능한 파일 방식은 txt 파일, binary 파일입니다.
파일 포인터
FILE *file = NULL;
파일 입출력을 위해 c언어에서는 파일 포인터를 활용합니다.
이 파일 포인터는, 일반 텍스트 편집기의 작성 위치를 나타내는 커서처럼
편집 위치를 제어하는 역할을 가지고 있습니다.
EOF
if (fscanf(FILE *, "%d %d",&value, &value1) == EOF)
EOF
는 End Of File
의 약자로, 현 위치에서 더 읽을 내용이 없음을 나타냅니다.
fscanf()
함수에서 더 이상 읽을 데이터가 없을때, 함수는 EOF
를 return
합니다.
feof()
if (feof(file))
해당 파일이 EOF
(더 읽을 내용이 없음)상태인지 판단하는 함수입니다.
EOF
상태일 때, feof()
함수는 1 (true)
을 return
합니다.
fseek()
fseek(FILE*, 위치 기준 바이트 위치, 위치)
파일을 읽는 파일 포인터를 조정하는 함수입니다.
위치에 들어갈 데이터는 3가지가 있습니다.
SEEK_SET
-> 첫 위치
SEEK_CUR
-> 현 위치
SEEK_END
-> 끝 위치
fseek(fp, 0, SEEK_END);
파일 포인터의 위치를 끝위치로 이동하는 예제 코드 입니다.
파일 열기
fopen()
file = fopen("text.txt", "w");
파일을 여는 기본적인 함수입니다.
c언어 코드 파일을 기준으로 경로를 지정할 수 있으며, 파일 이름을 입력하여 파일을 열 수 있습니다.
개방모드 openmode
"r" : 읽기 모드 -> 파일이 없으면 NULL
"w" : 쓰기 모드 -> 파일이 없으면 생성, 있으면 모든 내용 제거 이후 작성
"a" : 이어 쓰기 모드 -> 파일의 내용 뒷부분 부터 작성 가능
"+" : 읽기, 쓰기
fopen
함수 두번째 매개변수로 들어가는 설정 값입니다.
파일을 활용할 방식을 지정할 수 있습니다.
file = fopen("text.txt", "wt");
기본적으로 텍스트 파일을 편집할 때는 개방모드뒤에 t
를 붙여서 작성합니다.
바이너리 파일을 편집할 때는 개방모드 위에 b
를 붙여서 작성합니다.
하지만 텍스트파일의 경우는 생략이 가능합니다.
파일 읽기, 쓰기
읽기
fscanf()
fscanf(FILE*, "%d", &i);
데이터를 읽는 함수입니다.
일반적인 입출력에 사용하는 scanf
함수와 거의 비슷한 구조를 가지고 있습니다.
매개변수로 file
이 들어가는 것이외에는 같은 구조입니다.
파일이 읽기모드로 열린 상태가 아니면 사용할 수 없습니다.
fgetc() / getc()
char value = fgetc(FILE*);
char value = getc(FILE*);
같은 기능을 하는 두 함수입니다.
파일에서 문자 하나(char)
를 받아 return
합니다.
fgets()
fgets(str[], size, FILE*);
파일에서 한 줄을 받아 return 하는 함수.
줄바꿈 문자 ‘\n’ 을 읽어오는 경우가 있어 주의해야 한다.
쓰기
fprintf()
fprintf(FILE*, format, value);
파일에 데이터를 출력하는 함수입니다.
위에서 사용했던 fscanf()
함수와 동일하게, 매개변수로 파일 포인터가 추가된 것 이외에는 다른것이 없습니다.
하지만 파일이 쓰기모드 (write mode)상태로 열린것이 아니라면 사용할 수 없습니다
fputc() / putc ()
fputc(char, FILE*);
putc(char, FILE*);
같은 기능을 하는 두 함수입니다.
파일에 문자 하나(char)
를 출력 합니다.
fputs()
fputs(char*, FILE*);
파일에 문자열을 출력하는 함수입니다.
만약 문자열의 길이가 길어 fprintf()
사용이 불편한 경우에 효율적으로 활용할 수 있습니다.
출력 마지막에 ‘\n’ 을 출력하지 않습니다.
파일 저장
fclose()
fclose(FILE*);
파일 포인터의 연결을 종료하며 파일이 저장됩니다.
만약 쓰기모드(write mode)
에서 fclose()를 하지 않는다면, 파일이 저장되지 않습니다.
💡 지적 환영합니다
Comments