Nagie's DevStory

[C] 48. 파일 입출력 ( 5 ) 본문

Programming/C

[C] 48. 파일 입출력 ( 5 )

Nagie 2023. 10. 10. 00:19
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