Nagie's DevStory
[C] 48. 파일 입출력 ( 5 ) 본문
728x90
마지막으로 알아볼 파일 입출력 함수는 fseek()이다.
파일 입출력을 다루면서 보안 결함이 해결된 함수를 사용하지 않았더니
VS2022에서 SDL로 인한 문제가 생겨 컴파일이 안 되는 문제를 확인했다.
해당 문제를 해결하려면 IDE 세팅에서 SDL 검사를 끄거나
아래의 코드처럼 소스 코드 최상단에 전처리를 해주면 해결된다.
#define _CRT_SECURE_NO_WARNINGS
사전 준비가 끝났다면 파일 포인터를 다뤄 파일의 위치를 자유자재로 접근할 수 있는 fseek()에 대해 알아보자.
다음은 fseek() 함수의 원형이다.
int fseek(FILE *stream, long int offset, int origin);
첫 인수로 파일 포인터를 받고 두 번째 인수는 이동할 위치를 받는다.
바이트 단위로 받으며 세 번째 인수에 따라 이동 조건이 달라진다.
세 번째 인수는 이동할 위치의 기준점을 받는다.
3가지의 기준점이 있으며 본래는 정숫값을 받지만, 재정의 되어 아래와 같이 사람이 보기 좋은 형태를 띤다.
origin 타입 | 설명 |
SEEK_SET |
파일의 시작 위치 기준으로 offset 만큼 이동 |
SEEK_CUR |
현재 파일 포인터의 위치 기준으로 offset만큼 이동 |
SEEK_END |
파일의 끝 위치를 기준으로 offset만큼 이동 |
그렇다면 fseek()의 사용 방법을 알아보자.
아래는 fseek()를 사용해 파일의 내용을 읽어오는 예시이다.
#include <stdio.h>
int main() {
FILE* file;
fopen_s(&file, "example.txt", "r");
if (file == NULL) {
printf_s("Error opening the file");
return 1;
}
// 파일 포인터를 파일의 시작으로 이동
fseek(file, 0, SEEK_SET);
char ch;
while ((ch = fgetc(file)) != EOF) {
// 파일 내용을 한 글자씩 읽어와서 처리
putchar(ch);
}
// 파일 포인터를 파일의 끝으로 이동
fseek(file, 0, SEEK_END);
// 파일의 끝 위치(파일 크기)을 얻어옴
long fileSize = ftell(file);
printf_s("\n\nFile size: %ld bytes\n", fileSize);
fclose(file);
}
example.txt에 123456789가 저장되어 있다면
위 예시의 결과는 123456789가 나오게 된다.
fseek()의 origin타입을 바꿔가며 여러 가지 출력을 해보는 걸 추천한다.
728x90
Comments