fopen_s(File** _Stream, const char* _FileName, const char* _Mode)
- 기존의 fopen 함수의 안전성 문제로 개선되어 나온 것이 fopen_s 함수입니다.
- File** _Stream
- 열린 파일에 대한 포인터를 수신할 파일 포인터에 대한 포인터입니다.
- const char* _FileName
- 파일의 경로 및 이름 입니다. 경로를 작성하지 않고 파일 명만 작성한다면, 프로젝트 폴더를 기본으로 합니다.
- 만약 exe 파일로 실행했을 경우엔, 해당 exe 파일이 존재하는 폴더를 기본으로 하게 됩니다.
- const char* _Mode
- '파일에 대한 처리 방식과 어떤 파일인지' 와 같은 2가지로 구분이 됩니다.
- 파일에 대한 처리 방식 : r(읽기), w(쓰기), a(접근)
- 어떤 파일인지 : t(텍스트 파일), b(바이너리 파일)
ex) fopen_s(&file, "test.txt", "wt")
읽기 모드의 텍스트 파일을, 프로젝트 폴더에 test.txt 라는 이름으로 생성하는 것입니다.
- _Mode 인자에는 어떤 파일인지에 대한 부분 없이 "r", "w" 등만 작성해서 사용할 수도 있습니다.
- 각 모드별 파일이 열리는 방식에 차이가 있을 수 있습니다.
- 참고 링크 : 씹어먹는 C 언어 - <23 - 2. 파일 하고 이야기 하기 (파일 입출력)> (modoocode.com)
int fclose(File* _Stream)
- 열었던 파일을 닫을 때 사용합니다.
- fopen_s 함수를 사용해서 파일을 열었다면 반드시 fclose 함수를 사용해서 닫아주는 것이 좋습니다.
- 파일을 성공적으로 닫았다면 0, 그렇지 않다면 EOF(-1) 를 반환합니다.
ex) fclose(file);
size_t fwrite(const void* _Buffer, size_t _ElementSize, size_t _ElementCount, FILE* _Stream);
- const void* _Buffer
- 스트림에 쓰여질 배열을 가리키는 포인터
- 여기서 스트림이란 4번째 인자인 FILE* _Stream 을 뜻한다.
- 쉽게 말해서 FILE* _Stream 에서 지정하는 파일에 쓰여질 배열을 가리키는 포인터이다.
- size_t _ElementSize
- 첫번째 인자인 _Buffer 배열 각 원소의 크기
- size_t _ElementCount
- 첫번째 인자인 _Buffer 배열의 원소의 수.
- 각 원소의 크기는 두번째 인자인 _ElementSize 바이트 이다.
- FILE* _Stream
- 내용을 쓸 스트림을 가리키는 FILE 포인터
- 반환값
- 스트림에 성공적으로 써진 전체 원소의 개수는 정수형인 size_t 형으로 반환됩니다. 만일, 쓰여진 바이트 수와 _ElementCount 의 값이 다르다면 오류가 발생하게 됩니다.
1
2
3
4
5
6
7
8
|
int main() {
FILE* file;
char buffer[] = {'a', 'b', 'c'};
fopen_s(&file, "test.txt", "wt");
fwrite(buffer, 1, sizeof(buffer), file);
fclose(file);
return 0;
}
|
cs |
위에서 배운 함수들을 이용해서 파일에 'abc' 라는 문자열을 입력하는 코드입니다.
size_t fread(void* buffer, size_t _ElementSize, size_t _ElementCount, FILE* _Stream);
- void* buffer
- _ElementSize * _ElementCount 의 크기를 가지는 배열 포인터
- size_t _ElementSize
- 읽어들일 원소의 크기
- 단위는 바이트- _ElementSize 값이 4라면, 읽어들일 원소 하나의 크기는 4바이트임을 뜻한다.
- size_t _ElementCount
- 읽어들일 원소의 개수
- 각 원소의 크기는 _ElementSize 바이트이다.
- FILE* _Stream
- 데이터를 입력받을 스트림의 FILE 객체를 가리키는 포인터
- 쉽게 말해서 읽어들일 데이터를 가진 파일
- 반환값
- 성공적으로 지정한 원소의 개수 만큼 읽어들였다면 읽어들인 원소의 개수가 정수 타입 size_t 형으로 리턴된다.
- 만일 읽어들인 개수가 _ElementCount 인자에서 지정한 것과 다르거나, End OF File 에 도달하였다면 오류가 발생한다. - 이 때, ferror함수나 feof함수를 이용하여 어떠한 오류인지를 파악할 수 있습니다.
int fputs(const char*_Buffer, FILE*_Stream)
- const char *_Buffer
- 스트림에 쓰여질 NULL 문자로 끝나는 문자열.
- 쉽게 말해, 파일에 작성될 문자열을 뜻한다.
- FILE *_Stream
- 문자열을 쓸 스트림의 FILE 객체를 가리키는 포인터
- 쉽게 말해, 문자열이 작성될 파일을 가리킨다.
- 반환값
- 성공한다면 음이 아닌 수가 리턴되고, 그렇지 않다면 EOF를 리턴한다.
char* fgets(char*_Buffer, int _MaxCount, FILE*_Stream)
- char*_Buffer
- 읽어들일 문자열을 저장할 포인터
- int _MaxCount
- 마지막 NULL 문자를 포함하여 읽어들일 최대 문자 수.
- NULL 문자를 포함한다는 것에 유의하라.
- FILE*_Stream
- 문자열을 읽어들일 스트림의 FILE 객체를 가리키는 포인터.
- 특히, 표준 입력에서 입력을 받으려면 여기에 stdin 을 써주면 된다.
- 반환값
- 성공적으로 읽어들였다면 문자열(_Buffer)을 반환한다.
- 만일 파일 끝에 도달하였는데 아무런 문자도 읽어들이지 않았다면 _Buffer 문자열의 내용은 변하지 않고 그 대신 null 포인터가 리턴된다.
- 오류가 발생해도 null 포인터가 리턴된다.
- ferror함수나 feof를 사용해서 각각 어떤 오류가 발생하였는지, 파일 끝에 도달하였는지 알 수 있다.
- 스트림에서 문자열을 받아서 NULL 문자를 포함한 _MaxCount 개의 문자를 입력받으면 끝이 난다.
- 혹은, 개행 문자나 파일의 끝에 도달하면 자동으로 끝이 난다. 이 때, 개행문자도 마찬가지로 읽어들인 다는 점을 유의
- NULL 문자는 자동으로 마지막으로 입력받은 문자 뒤에 삽입된다.
1
2
3
4
5
6
7
8
9
10
11
|
int main() {
FILE* file;
char sentence[256];
printf("mylog.txt 에 추가할 문자열을 입력하세요: ");
fgets(sentence, 255, stdin);
fopen_s(&file, "mylog.txt", "w");
fputs(sentence, file);
fclose(file);
return 0;
}
|
cs |
fgets, fputs를 사용한 예제입니다.
사용자로부터 표준 입력으로 문자열을 입력받은 후, 그 문자열을 file에 넣어주는 코드입니다.
틀린 부분이나 이상한 부분이 있으면 댓글로 편하게 지적해주세요!
감사합니다!
참고 링크
'C,C++ > 정보정리' 카테고리의 다른 글
[C/C++] Vector 함수(push_back, emplace_back) (1) | 2022.10.05 |
---|---|
[C/C++] 가상함수 (0) | 2022.09.30 |
[C/C++] _getch() 함수 (0) | 2022.09.23 |
[C/C++] enum, enum class 차이점 (0) | 2022.09.20 |
[C/C++] cin 관련 함수, system 함수 (2) | 2022.09.17 |
댓글