#include <iostream>
#include <fstream>
using namespace std;
int main()
{
char co[21] = "";
ofstream fout; //파일로 내보내기
ifstream fin; //파일을 가져오기
cin >> co;
fout.open("../test.txt"); //../는 현재 폴더의 전 폴더
fout << co << " "; //co에 넣은 값을 넣고 ' '한번 띄어 쓴다. abcd
fout << co[0]; //co에 있는 0~3까지의 값을 넣는다. 안 띄어썼기 때문에 값이 붙여진다. abc
fout << co[1];
fout << co[2] << " "; //한번 띄워서 abc d가 되게한다.
fout << co[3];
fout.close(); //한번 파일을 열었으면 꼭 닫아준다.
char ci;
fin.open("../test.txt");
while(fin.get(ci)) //써있는 모든 글자를 가져온다.
{
cout << ci;
}
fin.close();
}
입력값
abcd
출력값
abcd abc d
fout.open("../test.txt");
fout << co << " ";
fout << co[0];
fout << co[1] << " ";
fout << co[2];
fout << co[3];
fout.close();
입력값
안녕하세요안녕하세요
출력값
안녕하세요안녕하세요 안 녕
- 한글은 입력이 2개씩 차지한다 만약co[0]만쓰면 출력을 제대로 하지못한다.
- 열려고 하는 파일이 없을 경우 새로 그 이름의 파일을 만들어서 입력한다.
입출력 타입
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
const string file = "../test.txt";
int main()
{
char ch;
ifstream fin(file); //선언과 동시에 파일을 열 수 있다.
if (fin.is_open())
{
cout << file << " 현재 내용은 다음과 같다.\n";
while (fin.get(ch))
cout << ch;
fin.close();
}
ofstream fout(file, ios_base::out); //오른쪽의 값은 읽기쓰기타입
if (!fout.is_open())
{
cerr << "출력을 위해" << file << " 파일을 열 수 없다.\n";
exit(EXIT_FAILURE);
}
cout << "\n내용을 입력하세요.\n";
string memo;
while (getline(cin, memo) && memo.size() > 0)
{
fout << memo << endl;
}
fout.close();
fin.open(file);
if (fin.is_open())
{
cout << file << " 바뀐 내용은 다음과 같다.\n";
while (fin.get(ch))
cout << ch;
fin.close();
}
return 0;
}
- ofstream fout(file, ios_base::out); //오른쪽의 값은 읽기쓰기타입
종류
ios_base::in 읽기 위해 연다.
ios_base::out 쓰기 위해 열고, 파일이 이미 존재하면 내용을 비운다.
ios_base::out | ios_base::app 쓰기 위해 열고, 뒤에 덧붙인다.
ios_base::in | ios_base::out 읽기,쓰기 겸용으로 열고, 파일 안의 어디에나 쓸 수 있다.
ios_base::in | ios_base::out | ios_base::trunc 읽기,쓰기 겸용으로 열고 파일이 이미 존재하면 그 파일의 내용을 먼저 비운다.
c++mode | ios_base::binary c++모드와 2진모드로 연다. ios_base::in | ios_base::binary와 같이 모드와 혼용할 수 있는 것이다.
c++mode | ios_base::ate c++모드로 열고 파일의 끝으로 파일 포인터를 이동한다.
- ios_base::app과 ios_base::ate는 둘 다 열은 파일의 끝으로 파일 포인터를 이동시킨다.
둘의 차이는 app는 파일의 끝에만 데이터를 덧붙일 수 있고, ate는 파일포인터를 파일의 끝에 위치시킨다.
2진 파일
기본적으로 구조체의 내용을 저장하려면 각 데이터를 따로 저장해야한다.
struct testing
{
string name;
double pops;
};
testing te;
ofstream fout(file, ios_base::out);
te.name = "sssss";
te.pops = 3.456789;
fout << te.name << " " << te.pops << "\n";
fout.close();
- 구조체의 변수들이 많아지면 번거롭다.
struct testing
{
string name;
double pops;
};
testing te;
ofstream fout(file, ios_base::out | ios_base::binary);
int i = 2;
while (i--)
{
cin >> te.name >> te.pops;
fout.write((char*)&te, sizeof te);
}
fout.close();
ifstream fin(file, ios_base::in | ios_base::binary);
if (fin.is_open())
{
while (fin.read((char*)&te, sizeof te))
{
cout << te.name << " " << te.pops << "\n";
}
fin.close();
}
- 공간을 덜 차지한다.
- 처리 속도가 빠르다.
- write로 쓰고 read로 읽어온다. char* 로 저장하여 sizeof로 크기만큼 저장
'C++ > Basic' 카테고리의 다른 글
[C++] 가변인자 템플릿 (0) | 2021.08.25 |
---|---|
[C++] 람다 (0) | 2021.08.24 |
[C++] cin, get, getline (0) | 2021.08.17 |
[C++] cin의 false/true (0) | 2021.08.13 |
[C++] 출력 함수 (0) | 2021.08.12 |