파일 읽기/쓰기

manmarru·2024년 1월 24일

c++

목록 보기
7/24


읽기/쓰기를 위해 파일을 만들었다.

C++

출력은 fstream, 입력은 ostream 이 있다.

#include <fstream>
#include <ostream>

일반 읽기/쓰기

fstream

//파일 여는 두 가지 방법
ifstream Load("./Save.txt"); // 선언과 동시에 초기화
Load.close();

Load.open("./Save.txt"); // 선언 후 초기화
int input;
for (int i = 0; i < 3; i++)
{
	Load >> input;
	cout << input << endl;
}
Load.close();
  • cin 쓰는것처럼 꺾쇠로 읽으면 띄어쓰기 단위로 읽을 수 있다.

ostream

save.txt 에 아무 내용이 없는 상태로 시작한다.
바이너리화해서 저장하는 방법이랑 그냥 저장하는 방법이 있는데, 읽는 방식과 쓰는 방식을 통일하지 않으면 데이터 크기 등에서 오류가 발생한다.

ofstream Save("./Save.txt", ios::trunc);
// ios::trunc = 기존 내용을(있으면) 삭제한다.
Save << 1 << ' ' << 2 << ' ' << 3 << ' ';
Save.close();

Save.open("./Save.txt", ios::app); //ios::app = 기존 내용에 덧붙임
Save << 1 << ' ' << 2 << ' ' << 3;
Save.close();


1 2 3 을 저장하고
그 후 파일 끝에1 2 3을 저장했다.

바이너리화 읽기/쓰기

  • 바이너리화 읽기/쓰기는 비트 연산자(>>, <<)를 사용할 수 없다.
  • 옵션에 ios::binary를 넣어야 한다.

쓰기

ofstream Save("./Save.txt", ios::binary | ios::trunc);
int i[3] = { 1, 2, 3 };
for (int j = 0; j < 3; j++)
{
	Save.write((const char*)&i[j], sizeof(int));
}

Save.close();


바이너리화 돼서 눈으로는 알아볼 수 없게 저장됐다.

읽기

ifstream Load("./Save.txt", ios::binary);
int i;
for (int j = 0; j < 3; j++)
{
	Load.read((char*)&i, sizeof(int));
	cout << i << ' ' << "\n\n\n";
}

Load.close();

C

파일 입출력 과정

  1. 파일을 개방(스트림 생성, 핸들 생성)
  2. 파일 쓰기(저장), 파일 읽기(불러오기) 함수 호출
  3. 개방했던 파일 소멸

  • fopen_s(개방할 스트림을 저장할 FILE 구조체 주소, 파일의 경로(파일의 이름까지의 경로), 입출력 모드 옵션)
    errno_t fopen_s(FILE* _Stream, char const _FileName,char const* _Mode)
    개방 성공 시 0 리턴, 실패 시 음수 리턴
    참고로 주소쓸때 \ 쓰면 걍 문자 붙이는걸로 간주되고 \\로 써야 경로로 들어가진다.

  • fseek : 파일 커서의 위치를 이동시키는 함수
    ftell : 현재 파일 커서의 위치를 알려주는 함수

  • fwrite(저장할 데이터의 첫번째 주소, 데이터의 크기, 개수, 개방한 스트림)

  • fread(저장할 데이터의 첫번째 주소, 데이터의 크기, 개수, 개방한 스트림)?

  • fclose(포인터)

  • errno_t

  • feof : 커서가 eof에 도달했는지 검사하는 함수, 파일에 끝에 도달할 경우 0이 아닌 값을 반환

모드

  • r : 읽기 가능 (파일 없으면 에러)

  • w : 쓰기 가능

  • a : 파일 끝에 덧붙여서 쓰기 가능

  • r+ : 읽기/쓰기 가능 (파일 없으면 에러)

  • w+ : 읽기/쓰기 가능

  • a+ : 읽기/덧붙여 쓰기 가능

  • wt : write text 텍스트 형태

  • wb : 바이너리화 파일

  • rt : 읽기 모드

  • rb : 바이너리화 읽기 모드

대충 예제 만들었음

#include "pch.h"


int main()
{
    char szIP[64];
    cin >> szIP;
    FILE* pload;
    //문자열 입력받아서 저장하기
    fopen_s(&pload, "..\\Data\\IPsetting.txt", "w");
    fwrite(szIP, sizeof(char)*strlen(szIP), 1, pload);
    fclose(pload);
    
    memset(szIP, '\0', sizeof(szIP));

	//텍스트 파일의 문자 전부 읽기
    fopen_s(&pload, "..\\Data\\IPsetting.txt", "r");
    while (!feof(pload))
    {
        fread(szIP, sizeof(char), 1, pload);
        cout << szIP;
        memset(szIP, 0, sizeof(char) * strlen(szIP));
    }
    fclose(pload);
    
} 

0개의 댓글