서울 원주민 본의 공부방

#include <iostream>

using namespace std;

void main()
{
// 스트림 개방
// fopen_s()
// errno_t : 파일 개방 성공 시 0을 반환, 실패 시 이유에 따른 값을 반환
// FILE** _Stream : 함수 내부에서 할당해주기 때문에 FILE* 의 주소를 전달한다.
// const char* _FileName : 경로와 파일 이름, 확장자까지 전달해야 한다.
// -> 프로그램과 연결될 파일의 정보를 설정한다.
// const char* _Mode : 입력인지, 출력인지, Text모드인지, Binary모드인지 전달

//// 파일 출력
//FILE* fp = nullptr;

//errno_t err = fopen_s(&fp, "../Data/Text.txt", "wt");

 

//if (0 == err)
//{
// fputs("Hello", fp);

// cout << "파일 개방 성공" << endl;
// fclose(fp);
//}
//else
// cout << "파일 개방 실패" << endl;


//// 파일 입력
//char szBuff[16] = "";

//FILE* fp = nullptr;
//errno_t err = fopen_s(&fp, "../Data/Text.txt", "rt");

//if (0 == err)
//{
// fgets(szBuff, 16, fp);

// cout << "파일 개방 성공" << endl;
// fclose(fp);
//}
//else
// cout << "파일 개방 실패" << endl;

//cout << szBuff << endl;



// 파일 입출력 모드
// 입출력 종류
// r : Read의 약자. 읽기 모드일 때 사용한다.
// w : Write의 약자. 쓰기 모드일 때 사용한다.
// -> 파일에 데이터가 있을 경우 모두 지운 후 작업한다.

// a : Append의 약자. 덧붙여쓰기 모드일 때 사용한다.
// -> 파일에 데이터가 있을 경우 맨 마지막부터 작업한다.

// + : 읽기/쓰기 모두 가능한 모드이다!
// -> 편리하고 좋은 모드라고 생각할 수 있으나, 읽기에서 쓰기로, 쓰기에서 읽기로
// -> 작업이 변경될 경우 버퍼에 데이터가 남아있을 경우 문제가 발생하기에
// -> 매번 버퍼를 비워줘어야 하는 불편함이 있다!!


// 데이터 종류
// t : Text의 약자. 사람이 읽고 쓰기 가능한 모드이다.
// b : Binary의 약자. 컴퓨터가 읽고 쓰기 쉬운 모드이다.


// 문제
/*
이름, 나이, 연락처를 입력 받고
입력 받은 정보들을 파일에 출력해보기!
-> 메모장을 열 경우 입력한 정보들이 보여지면 된다!!
*/

//char szInput[32] = "";
//char szBuff[3][32] = {"이름: ", "나이: ", "연락처: " };

//FILE* fp = nullptr;

//errno_t err = fopen_s(&fp, "../Data/Info.txt", "wt");

//if (0 == err)
//{
// for (int i = 0; i < 3; ++i)
// {
// cout << szBuff[i];
// fgets(szInput, 32, stdin);
// strcat_s(szBuff[i], 32, szInput);

// fputs(szBuff[i], fp);
// }

// cout << "파일 개방 성공" << endl;
// fclose(fp);
//}
//else
// cout << "파일 개방 실패" << endl;



char szBuff[3][32] = {};

FILE* fp = nullptr;
errno_t err = fopen_s(&fp, "../Data/Info.txt", "rt");

 

if (0 == err)
{
for (int i = 0; i < 3; ++i)
{
fgets(szBuff[i], 32, fp);
cout << szBuff[i];
}

cout << "파일 개방 성공" << endl;
fclose(fp);
}
else
cout << "파일 개방 실패" << endl;


}

 

#include <iostream>

using namespace std;

void main()
{
// 바이너리모드 입출력

// 바이너리모드 출력 함수
// fwrite()
// size_t : 출력 성공 시 _ElementCount을 반환, 실패 시 _ElementCount 보다 작은 값을 반환
// const void* _Buffer : 출력할 메모리의 시작 주소를 전달
// size_t _ElementSize : 시작 주소부터 얼마만큼 출력할지 크기를 전달(byte단위)
// size_t _ElementCount : 해당 크기를 몇 개 출력할 지 개수를 전달
// FILE* _Stream : 개방한 스트림

//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;



// 바이너리모드 입력 함수
// fread()
// size_t : 입력 성공 시 _ElementCount을 반환, 실패 시 _ElementCount 보다 작은 값을 반환
// 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(int), 5, fp);
fread(iArr, sizeof(iArr), 1, fp);

cout << "파일 개방 성공" << endl;
fclose(fp);
}
else
cout << "파일 개방 실패" << endl;

for (int i = 0; i < 5; ++i)
cout << iArr[i] << endl;



// Text모드와 Binary 모드의 차이점
// ##1. 속도 차이
// ##2. 편리함
// -> 바이너리 모드는 연속된 메모리를 사용하는 경우 입출력이 용이하다.


// 파일 입출력 시 주의사항
// 포인터 변수는 저장하지 말자!!!!!!!!!
int iA = 0;
int* ptr = &iA;

}

'개발 공부 > C++' 카테고리의 다른 글

C++ 공용체,  (0) 2020.10.16
C++ 입출력 스트림버퍼  (0) 2020.10.08
C++ Text RPG  (0) 2020.10.08
C++ 동적할당  (0) 2020.10.08
C++ 성적표 예제  (0) 2020.10.08

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band