스트림 개방 함수

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

+ Recent posts