#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++ 공용체, (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 |