C++기초

220329(1)_이진 파일 입출력(1)_쓰기

hyrule 2022. 4. 6. 16:15
#include <iostream>

enum class EItemType
{
	Weapon,
	Armor
};

struct ItemInfo
{
	char   Name[32];
	EItemType   Type;
	int      Option;
	int      Price;
	int      Sell;
};

int main()
{
	FILE* File = nullptr;

	fopen_s(&File, "Test.txt", "rb");

	if (File)
	{


		//3번인자: 기준점을 정한다.
		//SEEK_END: 파일의 가장 끝
		//SEEK_SET: 파일의 시작점
		//SEEK_CUR: 현재 파일커서
		// 
		//2번인자는 Offset으로, 3번인자에 지정된 지점으로부터 
		//	몇 바이트만큼 떨어진 곳을 커서의 위치로 지정할지를 정한다.

		//아래는 파일 커서를 가장 끝으로 보낸다.
		fseek(File, 0, SEEK_END);

		//ftell은 현재 파일 커서의 위치를 받아온다.
		int FileSize = ftell(File);
		//파일 커서의 가장 끝의 위치를 받아왔음 --> 파일의 크기를 알 수 있다.


		//읽어왔으면 다시 파일 커서를 다시 처음으로 옮겨서 파일의 내용을 읽어올 수 있도록 한다.
		fseek(File, 0, SEEK_SET);


        int   Number = 0;

        // 1번 인자 : 읽어오고자 하는 메모리 주소
        // 2번 인자 : 읽어오고자 하는 데이터의 타입 크기
        // 3번 인자 : 읽어오고자 하는 데이터 개수
        fread(&Number, sizeof(int), 1, File);

        std::cout << Number << std::endl;

        int   Array[10] = {};

        fread(Array, sizeof(int), 10, File);

        for (int i = 0; i < 10; ++i)
        {
            std::cout << Array[i] << std::endl;
        }

        ItemInfo   Item = {};

        fread(&Item, sizeof(ItemInfo), 1, File);

        std::cout << "아이템이름 : " << Item.Name << std::endl;
        std::cout << "종류 : ";
        switch (Item.Type)
        {
        case EItemType::Weapon:
            std::cout << "무기" << std::endl;
            break;
        case EItemType::Armor:
            std::cout << "방어구" << std::endl;
            break;
        }

        std::cout << "옵션 : " << Item.Option << std::endl;
        std::cout << "Price : " << Item.Price << std::endl;
        std::cout << "Sell : " << Item.Sell << std::endl;

        fclose(File);

	}


	//앞으로 자주 사용하게 될 예정.
	//실무에서도 이거 자주 사용함.
	return 0;
}