본문 바로가기
코딩취미/C,C++

[C언어] fopen 대신 fopen_s 를 사용하는 이유, 특징 정리

by 브링블링 2023. 12. 14.
728x90

fopen_s 사용하는 이유

fopen_s 함수는 파일을 열기 위한 안전한 버전의 함수로, C11 표준에서 도입되었습니다. 이 함수는 버퍼 오버플로우 등의 보안 문제를 방지하기 위해 기존의 fopen 함수를 대체하는 목적으로 도입되었습니다.

errno_t fopen_s(FILE** stream, const char* filename, const char* mode);

 

fopen_s 함수의 전달인자:

  1. 파일 포인터의 주소 (FILE** stream):
    • 파일 포인터를 저장할 변수의 주소입니다. 파일을 열고 난 후에 이 변수에 파일 포인터가 저장됩니다.
  2. 파일 경로 (const char* filename):
    • 열고자 하는 파일의 경로를 나타내는 문자열입니다.
  3. 파일 열기 모드 (const char* mode):
    • 파일을 어떤 모드로 열 것인지를 나타내는 문자열입니다.
    • 주로 "r" (읽기), "w" (쓰기), "a" (추가) 등이 사용됩니다.

fopen_s 함수의 반환값:

  • 에러 코드 (errno_t):
    • 함수가 성공하면 0을 반환합니다.
    • 에러가 발생하면 에러 코드를 반환하며, 에러가 발생하지 않았다면 stream 매개변수에 파일 포인터가 저장됩니다.

fopen_s 함수의 사용 방법 및 특징:

fopen_s 함수는 fopen 함수와 유사하지만 몇 가지 차이점이 있습니다. 주로 다음과 같은 특징을 가지고 있습니다:

  1. 보안 강화:
    • fopen_s 함수는 버퍼 오버플로우 등의 보안 문제를 방지하기 위해 도입되었습니다.
  2. 에러 처리:
    • fopen_s 함수는 에러가 발생할 경우 에러 코드를 반환하고, 파일 포인터를 열지 못했을 때는 stream 변수에 NULL을 대입합니다.
  3. 모드 지정 시 변경:
    • fopen_s 함수에서는 파일 열기 모드를 지정할 때 명시적으로 길이를 지정해야 합니다. 따라서 "w" 대신 "w" 대신 "w"와 같이 모드 문자열의 길이를 지정해야 합니다.
  4. 문자열 처리의 안정성:
    • fopen_s 함수는 문자열 처리 함수에서 발생할 수 있는 오류를 방지하기 위해 몇 가지 안전성 개선을 제공합니다.

 

예시코드 : 아래 코드에서 fopen_s 함수는 "example.txt" 파일을 쓰기 모드로 열고, 열기에 성공하면 파일에 문자열을 쓰고 닫습니다. 만약 파일을 열지 못하면 에러 코드를 출력합니다.

#include <stdio.h>

int main() {
    FILE* file;
    const char* filename = "example.txt";
    const char* mode = "w";

    errno_t err = fopen_s(&file, filename, mode);

    if (err == 0) {
        // 파일 열기 성공
        fprintf(file, "Hello, World!\n");
        fclose(file);
        printf("File created successfully.\n");
    } else {
        // 파일 열기 실패
        printf("Error opening file. Error code: %d\n", err);
    }

    return 0;
}
728x90