안녕하세요 틴구입니다
"오늘은 파일 입출력을 설명 해보도록 할게요"
파일 입출력
하드디스크에 파일을 만들거나 있는 파일의 데이터를 얻어올때 사용합니다
언어마다의 방식
c언어 방식 : fopen 함수를 사용하여 처리한다.
c++ 방식 : ifstream, ofstream을 사용하여 처리한다.
오늘은 c언어 방식인 fopen을 사용할 것입니다.
ex) text파일 입,출력
fopen_s의 인자 종류
1번인자 : 파일 스트림
2번인자 : 파일 명이 들어가고
3번 인자에는 Mode가 들어간다.
Mode 종류
r : 파일을 읽어온다.
w : 파일을 만든다.
a : 파일에 접근하여 이어쓰기를 한다.
r+ : 파일이 존재하면 해당 파일을 읽고 쓰기 가능하게 연다. 파일이 없으면
에러를 반환한다.
w+ : 파일이 존재하면 해당 파일을 읽고 쓰기 가능하게 연다. 파일이 없으면
새로 만들어준다.
a+ : 파일이 존재하면 해당 파일의 끝부터 읽고 쓰기가 둘다 가능하게 연다.
파일이 없으면 새로 만든다.
t : 텍스트 파일
b : 바이너리 파일
rt : 텍스트파일을 읽어온다.
rb : 바이너리파일을 읽어온다.
wt : 텍스트파일을 만든다.
wb : 바이너리파일을 만든다.
나머지 조합도 다 가능하다.
위 사진을 보면 fputc, fputs, fprintf, fclose의 함수가 나오는데 각각 뭐냐!
fputc : 문자를 입력시키는 함수입니다.
1번 인자에는 문자를 넣어주고 2번 인자에는 파일 스트림을 넣어줍니다.
fputs : 말그대로 문자들 즉 문자열을 입력시키는 함수입니다.
1번 인자에는 문자열을 넣어주고 2번 인자에는 파일 스트림을 넣어줍니다.
fprintf : 이 함수도 문자열을 출력시키는 함수인데 fputs이랑은 다른점이 있다.
변수를 지정하고 변수를 출력시킬 수 있다.
1번 인자로는 파일스트림이 들어오고 2번인자로는 출력할 내용
3번 인자로는 변수명이 들어온다
여기서 %d는 정수를 받을때 사용합니다.
%s는 문자열을 받을때 사용합니다.
%f는 실수를 받을때 사용합니다.
출력할때는 위의 사진처럼 다시 fopen_s함수를 만들고 사용해야 합니다
입력 따로 출력 따로!
위의 코드를 출력하면
이러한 내용이 출력이 됩니다
fgetc = 문자 하나를 출력해주는 함수입니다
1바이트만 가능 (한글 출력 x)
그런데 여기서 좀 이상한게
char Line의 인덱스를 128로 했으면 다 출력되고 남아야하는데
다 출력되지 않는 이유는 파일 커서란 개념이 있는데 파일을 읽을때 파일의 커서가 처음 시작지점에서 시작을 하는데
이 파일커서가 fgets(Line, 127, FileStream);의 코드를 실행하면 입력 코드에서의 \n의 코드를
마치면 동작을 중단하는 개념입니다.
그래서 위의 코드를 출력을 하면 문자열이 2 줄이 출력되는 것입니다.
fgets(Line, 127, FileStream);
std::cout << Line << std::endl;
이 코드를 두 번 추가를 하면
위의 내용이 출력이 되는것을 확인할 수 있습니다.
변수의 값들이 %d에 들어가서 출력되는것을 확인할 수 있다.
binary 입,출력
ex)
enum class랑 구조체로 플레이어의 관련 내용을 구성
입력의 경우 처음
FILE* FileStream;
fopen_s(&FileStream, "Test.abc", "wb");
의 구조는 동일하다
1번 인자 : 파일 스트림의 주소
2번 인자 : 파일 명(확장자명 자유)
3번 인자 : 모드 명 (현재 : 입력 바이너리)
fwrite함수의 인자 설명
1번 인자 : 입력할 변수의 주소
2번 인자 : 해당 변수의 크기
3번 인자 : 개수
4번 인자 : 파일 스트림
마지막에 fclose(FileStream);으로 무조건 닫아줘야한다.
출력
전체적인 구조를 보면
입력때 사용했던 변수에 해당하는 타입을 새로 만들고 초기화를 한다.
그리고 fread함수를 사용하여 해당 변수를 출력한다.
마지막으로 fclose함수를 이용하여 닫는다.
의 형태 구성입니다.
fread함수의 인자 구성
fwrite함수의 인자 구성과 동일하다.
1번 인자 : 입력할 변수의 주소
2번 인자 : 해당 변수의 크기
3번 인자 : 개수
4번 인자 : 파일 스트림
구조체의 출력은 사용자가 fread함수 밑에
원하는 구조체의 멤버 변수를 따로 입력하여 출력해야 한다.
'c++' 카테고리의 다른 글
20210812 class 상속 (0) | 2021.08.13 |
---|---|
20210726~28 class TextRPG (0) | 2021.07.29 |
20210723 사용자 정의 헤더 파일 ~ Template (0) | 2021.07.25 |
20210722 객체 지향 프로그래밍 ~ static멤버함수,싱글톤 (0) | 2021.07.23 |
20210721 함수 ~ 오퍼레이 (0) | 2021.07.21 |
댓글