스트림 개방 함수
fopen_s()
errno_t
->스트림 개방 성공 시 0, 실패 시 이유에 따른 값을 반환
FILE** _Stream
-> 스트림을 저장할 변수의 주소를 전달한다.
-> 내부에서 동적할당해주기 때문에 이중 포인터를 사용한다.
const char* _FileName
-> 경로와 파일 이름, 확장자까지 전달한다.
const char* _Name
-> 읽기 / 쓰기, Text형식 / Binary형식 인지 전달한다.
스트림 소멸 함수
-> fclose()
쓰기
FILE* fp = nullptr;
절대 경로
errno_t err = fopen_s(&fp, "C:/Users/Desktop/Data/Text.txt", "wt");
상대 경로
errno_t err = fopen_s(&fp, "../Data/Text.txt", "wt");
스트림 개방
if (0 == err)
{
fputc('A', fp);
fputc('B', fp);
cout << "스트림 개방 성공" << endl;
fclose(fp);
}
else
cout << "스트림 개방 실패" << endl;
스트림 읽기
// 읽기
char chA = 0, chB = 0;
FILE* fp = nullptr;
errno_t err = fopen_s(&fp, "../Data/Text.txt", "rt");
if (0 == err)
{
chA = fgetc(fp);
chB = fgetc(fp);
cout << "파일 개방 성공" << endl;
fclose(fp);
}
else
cout << "파일 개방 실패" << endl;
cout << chA << ", " << chB << endl;
입출력 모드
r : Read의 약자. 읽기 모드일 때 사용한다. // 파일이 없을 경우 오류
w : Write의 약자. 쓰기 모드일 때 사용한다. // 파일이 없을 경우 생성
a : Append의 약자. 이어 쓰기 모드일 때 사용한다. // 파일이 없을 경우 생성
+ : 읽기 / 쓰기 모두 사용 가능
-> 좋은 모드라고 생각할 수 있으나, 읽기에서 쓰기로, 쓰기에서 읽기로 작업이 변경될 경우
-> 버퍼를 모두 비워주어야 하는 불편함이 있다.
데이터 종류 모드
t : Text의 약자. 사람이 읽고 쓰기 편한 모드.
b : Binary의 약자. 컴퓨터가 일고 쓰기 편한 모드.
binary 모드의 장점
#1. 속도가 빠르다.
#2. 그림, 영상, mp3 파일 등 읽기 어려운 파일의 입출력이 자유롭다.
#3. 배열 또는 구조체처럼 연속된 메모리를 사용하는 데이터일 경우 통째로 저장 및 불러오기가 가능하다.
binary 모드의 주의 사항
-> 저장하는 데이터 중 주소가 있을 경우 주소는 저장하면 안된다.
binary 모드 출력
fwrite()
const void* _Buffer
-> 저장할 메모리의 시작 주소
size_t _ElementSize
-> 얼마만큼 저장할 것인지 크기(byte단위)
size_t _ElementCount
-> 그 것들을 몇 개 저장할 것인지 전달
FILE* _Stream
-> 개방한 스트림을 전달
binary 모드 출력
int iArr[5] = { 1, 2, 3, 4, 5 };
FILE* fp = nullptr;
errno_t err = fopen_s(&fp, "../Data/Binary.txt", "wb");
if (0 == err)
{
fwrite(iArr, sizeof(iArr), 1, fp);
//fwrite(iArr, sizeof(int), 5, fp);
cout << "파일 개방 성공" << endl;
fclose(fp);
}
else
cout << "파일 개방 실패" << endl;
binary 모드 입력
fread()
const void* _Buffer
-> 어떤 메모리에 읽어올 것인지 시작 주소
size_t _ElementSize
-> 얼마만큼 읽어올 것인지 크기를 전달(byte단위)
size_t _ElementCount
-> 몇 개를 읽을 것인지 전달
FILE* _Stream
-> 어떤 스트림을 이용할 것인지 전달
int iArr[5] = {};
FILE* fp = nullptr;
errno_t err = fopen_s(&fp, "../Data/Binary.txt", "rb");
if (0 == err)
{
fread(iArr, sizeof(iArr), 1, fp);
//fread(iArr, sizeof(int), 5, fp);
cout << "파일 개방 성공" << endl;
fclose(fp);
}
else
cout << "파일 개방 실패" << endl;
for (int i = 0; i < 5; ++i)
cout << iArr[i] << endl;
이미지 파일 복사 방법
void main()
{
FILE* fp_In = nullptr;
FILE* fp_Out = nullptr;
errno_t err_In = fopen_s(&fp_In, "../Data/Image.jpg", "rb");
if (0 == err_In)
{
//////////////////////////////////////////////////////////////////////
errno_t err_Out = fopen_s(&fp_Out, "../Data/Copy.jpg", "wb");
if (0 == err_Out)
{
char ch = 0;
// 원본 파일의 사이즈 복사
while (true)
{
int iCnt = fread(&ch, sizeof(char), 1, fp_In);
if (1 > iCnt)
break;
fwrite(&ch, sizeof(char), 1, fp_Out);
}
cout << "복사 성공" << endl;
fclose(fp_Out);
}
else
cout << "복사 실패" << endl;
//////////////////////////////////////////////////////////////////////
cout << "불러오기 성공" << endl;
fclose(fp_In);
}
else
cout << "불러오기 실패" << endl;
}
'Programming > C++ Basic' 카테고리의 다른 글
C++ static과 클래스 , 멤버 함수 (0) | 2020.09.15 |
---|---|
C++ const 와 클래스, 멤버 함수 (0) | 2020.09.15 |
C++ 전방 선언 (0) | 2020.09.13 |
C++ 생성자와 소멸자, explicit 키워드 (2) | 2020.09.13 |
C++ 메모리 함수 (0) | 2020.09.13 |