Study: Software(SW)/SW: Language

[C++] ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: fstream ํŒŒ์ผ ์ž…์ถœ๋ ฅ(feat. ํŒŒ์ผ ์ „์ฒด ์ฝ๊ธฐ, ํ•œ ์ค„์”ฉ ์ฝ๊ธฐ)

DrawingProcess 2022. 8. 19. 17:12
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” '[C++] ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: fstream ๊ฐ์ฒด๋ฅผ ํ†ตํ•œ ํŒŒ์ผ ์ž…์ถœ๋ ฅ'์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ž…๋‹ˆ๋‹ค.
C++์˜ ๋Œ€ํ‘œ์ ์ธ ํŒŒ์ผ ์ž…์ถœ๋ ฅ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ fstream์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜์˜€์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

1. fstream ๊ฐ์ฒด๋ฅผ ํ†ตํ•œ ํŒŒ์ผ ์ž…์ถœ๋ ฅ

1.1. fstream ํŒŒ์ผ ์ž…์ถœ๋ ฅ ๊ธฐ๋ณธ

C++์˜ ifstream์ด๋‚˜ ofstream์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด <fstream> ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

#include <fstream>

ofstream์€ ํŒŒ์ผ์— ๊ธฐ๋กํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ณ  ifstream์€ ํŒŒ์ผ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ fstream ํด๋ž˜์Šค ์—ญ์‹œ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

ํด๋ž˜์Šค์˜ open() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์—ด๊ฑฐ๋‚˜ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

std::ofstream ofs;
ofs.open("ํŒŒ์ผ ๊ฒฝ๋กœ");

std::ifstream ifs;
ifs.open("ํŒŒ์ผ ๊ฒฝ๋กœ");

์ƒ์„ฑ์ž์— ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•ด์„œ ๋ฐ”๋กœ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

std::ofstream ofs("ํŒŒ์ผ ๊ฒฝ๋กœ");
std::ifstream ifs("ํŒŒ์ผ ๊ฒฝ๋กœ");

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#include <fstream>
#include <iostream>
#include <string>

int main()
{
	std::ofstream ofs("D:\\test.txt", std::ios::out | std::ios::app);
	if (ofs.fail())
	{
		std::cerr << "Error!" << std::endl;
	}

	std::ifstream ifs;
	ifs.open("D:\\test.txt", std::ios::in);
	if (!ifs)
	{
		std::cerr << "Error!" << std::endl;
	}
    ifs.close();
	return 0;
}

ofstream ๊ฐ์ฒด(ofs)๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๊ณ  ifstream ๊ฐ์ฒด(ifs)๋Š” open() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ open()์œผ๋กœ ํŒŒ์ผ์„ ์—ด ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ํ›„ close()๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฉฐ, close()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด fstream ๊ฐ์ฒด๋Š” RAII ํŒจํ„ด์ด ์ ์šฉ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ ์ž๋™์œผ๋กœ ๋‹ซํž™๋‹ˆ๋‹ค.

1.2. fstream ๊ฐ์ฒด๋ฅผ ํ†ตํ•œ ํŒŒ์ผ ์ž…์ถœ๋ ฅ ๋ชจ๋“œ

ํŒŒ์ผ์„ ์—ด ๋•Œ ๋ชจ๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ง€์›ํ•˜๋Š” ๋ชจ๋“œ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

in ํŒŒ์ผ์„ ์ฝ๊ธฐ ๋ชจ๋“œ๋กœ ์—ด๊ธฐ (ifstream์—์„œ ๊ธฐ๋ณธ๊ฐ’)
out ํŒŒ์ผ์„ ์“ฐ๊ธฐ ๋ชจ๋“œ๋กœ ์—ด๊ธฐ (ofstream์—์„œ ๊ธฐ๋ณธ๊ฐ’)
binary ํ…์ŠคํŠธ ๋ชจ๋“œ ๋Œ€์‹  ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“œ๋กœ ์—ด๊ธฐ
ate ์ถœ๋ ฅ ์œ„์น˜๊ฐ€ ํŒŒ์ผ์˜ ๋์—์„œ ์‹œ์ž‘
app ๋ชจ๋“  ์ถœ๋ ฅ์ด ํŒŒ์ผ์˜ ๋์— ์ถ”๊ฐ€ ๋จ
trunc ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์‚ญ์ œํ•˜๊ณ  ์—ด๊ธฐ
  • ์›ํ•˜๋Š” ํŒŒ์ผ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด OR ์—ฐ์‚ฐ์ž(|)๋กœ ๊ฒฐํ•ฉํ•ด์„œ ํŒŒ์ผ์„ ์—ด ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ผ์ด ์ •์ƒ์ ์œผ๋กœ ์—ด๋ ธ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด fail()์ด๋‚˜ bad() ํ•จ์ˆ˜ ๋“ฑ์„ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • C++11 ์ดํ›„๋ถ€ํ„ฐ๋Š” fstream์ด bool ํƒ€์ž… ๋ณ€ํ™˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์กฐ๊ฑด๋ฌธ์— ๋„ฃ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.

1.2.1. ํ…์ŠคํŠธ ๋ชจ๋“œ(๊ธฐ๋ณธ)

๋ผ์ธ ๋์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์šด์˜์ฒด์ œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ ๋ผ์ธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹
C HELLO\n
Windows HELLO\r\n
Unix, Linux HELLO\n
Mac HELLO\r

1.2.2. ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“œ

  • binary๋กœ ์ฝ๊ณ  ์“ธ ๋•Œ, string์„ binary๋กœ ๋ฐ”๊พธ์–ด ์ €์žฅํ•ด์•ผํ•˜๊ธฐ์— binary๋กœ encodeํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • file์„ binary๋กœ ์ฝ์–ด์„œ ์ถœ๋ ฅํ•ด๋ณด๋ฉด, ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ด์ƒํ•œ ์ˆซ์ž๋“ค๋กœ ์ฃฝ ๋‚˜์—ด๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • binary data๋ฅผ utf-8๋กœ ๋””์ฝ”๋”ฉํ•˜์—ฌ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์ œ๋Œ€๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€๋กœ, ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์“ฐ๋Š” ํ…์ŠคํŠธ๋“ค์˜ ๊ฒฝ์šฐ๋Š” binary์ผ ์ˆ˜๋„ ์žˆ๊ณ , text์ผ ์ˆ˜๋„ ์–‘ ์ชฝ ๋ชจ๋‘ ์ €์žฅ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ image๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌด์กฐ๊ฑด binary์ž…๋‹ˆ๋‹ค.

2. fstream ๊ธฐ๋ณธ ์˜ˆ์ œ

2.1. ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“œ ์˜ˆ์ œ

๋ฐ”์ด๋„ˆ๋ฆฌ ๋ชจ๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๊ฒฝ์šฐ, ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ std::ios::binary ์˜ต์…˜์„ ์ฃผ์–ด ์ฝ์–ด๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํŠน์ • ์˜ต์…˜๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” OR ์—ฐ์‚ฐ์ž(|)๋กœ ๊ฒฐํ•ฉํ•ด์„œ ํŒŒ์ผ์„ ์—ด ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ofstream

int n1 = 500;
int n2 = 1000;
double f = 3.14;
int arr[5] = {1, 2, 4, 8, 16};
string str = "ABCDE";

std::ofstream output("data.bin", std::ios::out | std::ios::binary);
output.write((char*)&n1, sizeof(int));
output.write((char*)arr, sizeof(arr));
output << n2 << f << str;
output.close();

ifstream

int n1, n2;
double f;
int arr[5];
string str;

std::ifstream input("data.bin", std::ios::in | std::ios::binary);
input.read((char*)&n1, sizeof(int));
input.read((char*)arr, sizeof(arr));
input >> n2 >> f >> str;

2.2. ํŒŒ์ผ ํ•œ ์ค„์”ฉ ์ฝ๊ธฐ (ifstream)

getline ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํŒŒ์ผ์„ ํ•œ ์ค„์”ฉ ์ฝ์–ด์„œ ํŠน์ • ๋ณ€์ˆ˜์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// std::string ์— ์ •์˜๋œ getline ์‚ฌ์šฉ
#include <fstream>
#include <iostream>
#include <string>

int main() {
	// ํŒŒ์ผ ์ฝ๊ธฐ ์ค€๋น„
	std::ifstream in("test.txt");
	if (!in.is_open()) {
		std::cout << "ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!" << std::endl;
		return 0;
	}
	std::string s;
	while (in) {
		getline(in, s);
		std::cout << s << std::endl;
	}
	return 0;
}

2.3. ํŒŒ์ผ ์ „์ฒด๋ฅผ ํ•œ ๋ฒˆ์— ์ฝ๊ธฐ (ifstream)

ํŠน์ • ๋ฌธ์ž์—ด์„ ํŒŒ์ผ๋กœ ๋–จ๊ถœ์„ ๊ฒฝ์šฐ, ๋ฌธ์ž์—ด ๋‚ด๋ถ€์— ๊ฐœํ–‰๋ฌธ์ž๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒŒ์ผ ์ „์ฒด๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

#include <fstream>
#include <iostream>
#include <string>

int main() {
	// ํŒŒ์ผ ์ฝ๊ธฐ ์ค€๋น„
	std::ifstream in("test.txt");
	std::string s;
	if (in.is_open()) {
		// ์œ„์น˜ ์ง€์ •์ž๋ฅผ ํŒŒ์ผ ๋์œผ๋กœ ์˜ฎ๊ธด๋‹ค.
		in.seekg(0, std::ios::end);
		// ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์œ„์น˜๋ฅผ ์ฝ๋Š”๋‹ค. (ํŒŒ์ผ์˜ ํฌ๊ธฐ)
		int size = in.tellg();
		// ๊ทธ ํฌ๊ธฐ์˜ ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•œ๋‹ค.
		s.resize(size);
		// ์œ„์น˜ ์ง€์ •์ž๋ฅผ ๋‹ค์‹œ ํŒŒ์ผ ๋งจ ์•ž์œผ๋กœ ์˜ฎ๊ธด๋‹ค.
		in.seekg(0, std::ios::beg);
		// ํŒŒ์ผ ์ „์ฒด ๋‚ด์šฉ์„ ์ฝ์–ด์„œ ๋ฌธ์ž์—ด์— ์ €์žฅํ•œ๋‹ค.
		in.read(&s[0], size);
		std::cout << s << std::endl;
	}
	else {
		std::cout << "ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!" << std::endl;
	}
	return 0;
}

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•