fopen, fopen_s
cppreference.net에서
| 헤더 <stdio.h>
|
||
FILE* fopen( const char* filename, const char* mode );
|
에 정의됨 (1) | (C99까지) |
FILE* fopen( const char* restrict filename, const char* restrict mode );
|
(C99부터) | |
errno_t fopen_s( FILE* restrict* restrict streamptr,
const char* restrict filename,
const char* restrict mode );
|
(2) | (C11부터) |
1)
filename로 지정된 파일을 열고 해당 파일에 연결된 파일 스트림에 대한 포인터를 반환합니다. mode는 파일 접근 모드를 결정하는 데 사용됩니다.2) (1)과 동일하지만, 파일 스트림에 대한 포인터가
streamptr에 기록되고 다음 오류들이 런타임에 감지되어 현재 설치된 제약 조건 처리기 함수를 호출한다는 점이 다릅니다:
streamptr이 널 포인터인 경우filename이 널 포인터인 경우mode이 널 포인터인 경우
fopen_s은 구현에서 __STDC_LIB_EXT1__를 정의하고 사용자가 __STDC_WANT_LIB_EXT1__을 정수 상수 1로 정의한 후 <stdio.h>를 포함하는 경우에만 사용 가능함이 보장됩니다.매개변수
| filename | - | 파일 스트림에 연결할 파일 이름 |
| mode | - | 파일 접근 모드 |
| 를 결정하는 널 종료 문자열 | streamptr | - |
함수가 결과를 저장할 포인터에 대한 포인터 (출력 매개변수)
| 파일 접근 플래그 파일 접근 |
모드 문자열 | 의미 | 설명
파일이 |
이미 존재할 때 동작
파일이 |
|---|---|---|---|---|
"r"
|
존재하지 않을 때 동작 | 읽기 | 읽기용 파일 열기 | 처음부터 읽기 |
"w"
|
열기 실패 | 쓰기 | 쓰기용 파일 생성 | 내용 파괴 |
"a"
|
새로 생성 | 추가 | 파일에 추가 | 끝에 쓰기 |
"r+"
|
새로 생성 | 읽기/쓰기 | 읽기/쓰기용 파일 열기 | 처음부터 읽기 |
"w+"
|
오류 | 쓰기/읽기 | 읽기/쓰기용 파일 생성 | 내용 파괴 |
"a+"
|
새로 생성 | 추가/읽기 | 읽기/쓰기용 파일 열기 | 끝에 쓰기 |
새로 생성
"b"파일 접근 모드 플래그 '\n'는 선택적으로 이진 모드로 파일을 열기 위해 지정할 수 있습니다. 이 플래그는 POSIX 시스템에서는 효과가 없지만, Windows에서는 '\x1A' 및 의 특수 처리를 비활성화합니다. | ||||
| 추가 파일 접근 모드에서는 파일 위치 표시기의 현재 위치에 관계없이 데이터가 파일 끝에 기록됩니다. 모드가 위에 나열된 문자열 중 하나가 아니면 동작이 정의되지 않습니다. 일부 구현에서는 추가 지원 모드(예: Windows | ||||
)를 정의합니다.
'+'업데이트 모드()에서는 입력과 출력이 모두 수행될 수 있지만, 출력 후에는 fflush, fseek, fsetpos 또는 rewind를 호출하지 않고 입력을 수행할 수 없으며, 입력 후에는 fseek, fsetpos 또는 rewind | ||||
를 호출하지 않고 출력을 수행할 수 없습니다. 단, 입력 연산이 파일 끝을 만난 경우는 예외입니다. 업데이트 모드에서는 텍스트 모드가 지정된 경우에도 구현에서 이진 모드를 사용하는 것이 허용됩니다.
"x"파일 접근 모드 플래그 "w"는 "w+" 또는 지정자에 선택적으로 추가할 수 있습니다. 이 플래그는 파일이 존재하는 경우 함수가 실패하도록 강제하며, 덮어쓰지 않습니다.
| ||||
(C11)fopen_s 또는 freopen_s"w"를 사용할 때, "a" 또는 "u"로 생성된 파일에 대한 파일 접근 권한은 다른 사용자가 접근하지 못하도록 합니다. 파일 접근 모드 플래그 "w"는 "a" 또는 로 시작하는 모든 지정자 앞에 선택적으로 추가하여 기본 fopen 권한을 활성화할 수 있습니다.
| ||||
(C11)
반환값1)
filename 성공하면 새 파일 스트림에 대한 포인터를 반환합니다. 스트림은 가 대화형 장치를 가리키지 않는 한 완전히 버퍼링됩니다. 오류가 발생하면 널 포인터를 반환합니다. POSIX에서는 이 경우 errno가 설정되어야 한다고 요구합니다.2) 성공하면 0을 반환하고 새 파일 스트림에 대한 포인터가
*streamptr에 기록됩니다. 오류가 발생하면 0이 아닌 오류 코드를 반환하고 *streamptr에 널 포인터를 기록합니다(streamptr 자체가 널 포인터가 아닌 경우).참고
filename의 형식은 구현에 따라 정의되며, 반드시 파일을 참조하지는 않습니다(예: 콘솔 또는 파일 시스템 API를 통해 접근 가능한 다른 장치일 수 있음). 이를 지원하는 플랫폼에서는 filename에 절대 또는 상대 파일 시스템 경로가 포함될 수 있습니다.
예제
이 코드 실행하기
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char* fname = "/tmp/unique_name.txt"; // or tmpnam(NULL);
int is_ok = EXIT_FAILURE;
FILE* fp = fopen(fname, "w+");
if (!fp)
{
perror("File opening failed");
return is_ok;
}
fputs("Hello, world!\n", fp);
rewind(fp);
int c; // note: int, not char, required to handle EOF
while ((c = fgetc(fp)) != EOF) // standard C I/O file reading loop
putchar(c);
if (ferror(fp))
puts("I/O error when reading");
else if (feof(fp))
{
puts("End of file is reached successfully");
is_ok = EXIT_SUCCESS;
}
fclose(fp);
remove(fname);
return is_ok;
}
가능한 출력:
Hello, world!
End of file is reached successfully
참조
- C23 표준 (ISO/IEC 9899:2024):
- 7.21.5.3 The fopen 함수 (p: TBD)
- K.3.5.2.1 The fopen_s 함수 (p: TBD)
- C17 표준 (ISO/IEC 9899:2018):
- 7.21.5.3 The fopen 함수 (p: 223-224)
- K.3.5.2.1 The fopen_s 함수 (p: 428-429)
- C11 표준 (ISO/IEC 9899:2011):
- 7.21.5.3 The fopen 함수 (p: 305-306)
- K.3.5.2.1 The fopen_s 함수 (p: 588-590)
- C99 표준 (ISO/IEC 9899:1999):
- 7.19.5.3 The fopen 함수 (p: 271-272)
- C89/C90 표준 (ISO/IEC 9899:1990):
- 4.9.5.3 The fopen 함수
같이 보기
| 파일을 닫습니다 (함수) | |
| 출력 스트림을 실제 파일과 동기화합니다 (함수) | |
(C11) |
기존 스트림을 다른 이름으로 엽니다 (함수) |
C++ 문서 for fopen
| |