๐ ํ์ผ ์ ์ถ๋ ฅ์ ๋ง๋ฒ์ฌ: fstream ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ์ ๋ณต! ๐งโโ๏ธ

์๋ ํ์ธ์, ์ฝ๋ฉ ๋ง๋ฒ์ฌ ์ฌ๋ฌ๋ถ! ์ค๋์ C++์ ๊ฐ๋ ฅํ ๋๊ตฌ์ธ fstream ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๊น์ด ์๊ฒ ์์๋ณด๋ ค๊ณ ํด์. ํ์ผ ์ ์ถ๋ ฅ์ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ธฐ์ ์ค ํ๋๋ก, ์ฌ๋ฌ๋ถ์ ํ๋ก๊ทธ๋จ์ด ์ธ๋ถ ์ธ๊ณ์ ์ํตํ๋ ์ฐฝ๊ตฌ๊ฐ ๋์ด์ค๋๋ค. ๋ง์น ์ฌ๋ฅ๋ท(https://www.jaenung.net)์ด ๋ค์ํ ์ฌ๋ฅ์ ๊ฐ์ง ์ฌ๋๋ค์ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ ! ๐
๐ก ์๊ณ ๊ณ์ จ๋์? fstream์ "file stream"์ ์ค์๋ง๋ก, ํ์ผ๊ณผ ํ๋ก๊ทธ๋จ ์ฌ์ด์ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ด๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์.
์, ์ด์ fstream์ ์ธ๊ณ๋ก ๋น ์ ธ๋ณผ๊น์? ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ์์ํด๋ณผ๊ฒ์! ๐ฌ
1. fstream์ ๊ธฐ์ด: ํ์ผ ์ ์ถ๋ ฅ์ ABC
fstream ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ C++์์ ํ์ผ ์ ์ถ๋ ฅ์ ์ํด ์ฌ์ฉ๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ธ ๊ฐ์ง ์ฃผ์ ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค:
- ifstream: ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๋ฐ ์ฌ์ฉ (input file stream)
- ofstream: ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๋ฐ ์ฌ์ฉ (output file stream)
- fstream: ํ์ผ์์ ์ฝ๊ณ ์ฐ๊ธฐ๋ฅผ ๋ชจ๋ ํ ์ ์๋ ํด๋์ค
์ด ์ธ ๊ฐ์ง ํด๋์ค๋ ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ์ ๊ฑฐ๋ํ๋ ๊ฒ์ฒ๋ผ, ๊ฐ๊ฐ ํน๋ณํ ์ญํ ์ ์ํํฉ๋๋ค. ๐
๐ ์ฃผ์์ฌํญ: fstream์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฐ๋์ #include <fstream>
์ ํ๋ก๊ทธ๋จ ์๋จ์ ์ถ๊ฐํด์ผ ํด์!
์, ์ด์ ๊ฐ ํด๋์ค๋ฅผ ๋ ์์ธํ ์ดํด๋ณผ๊น์?
1.1 ifstream: ํ์ผ ์ฝ๊ธฐ์ ๋ง๋ฒ์ฌ ๐งโโ๏ธ
ifstream์ "input file stream"์ ์ค์๋ง๋ก, ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๋ฐ ํนํ๋ ํด๋์ค์ ๋๋ค. ๋ง์น ์ฑ ์ ์ฝ๋ ๊ฒ์ฒ๋ผ, ํ์ผ์ ๋ด์ฉ์ ํ๋ก๊ทธ๋จ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ฃ .
ifstream ์ฌ์ฉ์ ๊ธฐ๋ณธ ๋จ๊ณ:
- ifstream ๊ฐ์ฒด ์์ฑ
- ํ์ผ ์ด๊ธฐ
- ๋ฐ์ดํฐ ์ฝ๊ธฐ
- ํ์ผ ๋ซ๊ธฐ
๊ฐ๋จํ ์์ ๋ฅผ ํตํด ์ดํด๋ณผ๊น์?
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::ifstream inputFile("example.txt");
std::string line;
if (inputFile.is_open()) {
while (std::getline(inputFile, line)) {
std::cout << line << std::endl;
}
inputFile.close();
} else {
std::cout << "ํ์ผ์ ์ด ์ ์์ต๋๋ค!" << std::endl;
}
return 0;
}
์ด ์ฝ๋๋ "example.txt" ํ์ผ์ ์ด๊ณ , ๊ฐ ์ค์ ์ฝ์ด ํ๋ฉด์ ์ถ๋ ฅํ ํ ํ์ผ์ ๋ซ์ต๋๋ค. ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค๋ฅธ ์ฌ๋์ ์ฌ๋ฅ์ "์ฝ์ด์ค๋" ๊ฒ๊ณผ ๋น์ทํ์ฃ ? ๐
1.2 ofstream: ํ์ผ ์ฐ๊ธฐ์ ์ํฐ์คํธ ๐จ
ofstream์ "output file stream"์ ์ค์๋ง๋ก, ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ๋ฌ๋ถ์ ์ฐฝ์์ ์ธ ์์ด๋์ด๋ฅผ ํ์ผ์ ๋ด์ ์ ์๋ ๋ฉ์ง ๋๊ตฌ์์!
ofstream ์ฌ์ฉ์ ๊ธฐ๋ณธ ๋จ๊ณ:
- ofstream ๊ฐ์ฒด ์์ฑ
- ํ์ผ ์ด๊ธฐ (์์ผ๋ฉด ์๋ก ์์ฑ)
- ๋ฐ์ดํฐ ์ฐ๊ธฐ
- ํ์ผ ๋ซ๊ธฐ
๊ฐ๋จํ ์์ ๋ฅผ ๋ณผ๊น์?
#include <iostream>
#include <fstream>
int main() {
std::ofstream outputFile("newfile.txt");
if (outputFile.is_open()) {
outputFile << "์๋
ํ์ธ์, fstream์ ์ธ๊ณ์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค!" << std::endl;
outputFile << "์ด๊ฒ์ ofstream์ผ๋ก ์์ฑ๋ ์๋ก์ด ํ์ผ์
๋๋ค." << std::endl;
outputFile.close();
std::cout << "ํ์ผ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์์ต๋๋ค!" << std::endl;
} else {
std::cout << "ํ์ผ์ ์ด ์ ์์ต๋๋ค!" << std::endl;
}
return 0;
}
์ด ์ฝ๋๋ "newfile.txt"๋ผ๋ ์ ํ์ผ์ ๋ง๋ค๊ณ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ฌ๋ฌ๋ถ์ ์ฌ๋ฅ์ "๋ฑ๋กํ๋" ๊ฒ๊ณผ ๋น์ทํ์ฃ ! ๐
1.3 fstream: ์ฝ๊ธฐ์ ์ฐ๊ธฐ์ ๋ง๋ฅ ์ํฐํ ์ด๋ ๐ญ
fstream์ ifstream๊ณผ ofstream์ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ฐ์ง ํด๋์ค์ ๋๋ค. ํ์ผ์์ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ฅผ ๋์์ ํ ์ ์์ด์. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ฌ๋ฅ์ ๊ณต์ ํ๊ณ ๋ฐฐ์ฐ๋ ๊ฒ์ ๋์์ ํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ !
fstream ์ฌ์ฉ์ ๊ธฐ๋ณธ ๋จ๊ณ:
- fstream ๊ฐ์ฒด ์์ฑ
- ํ์ผ ์ด๊ธฐ (์ฝ๊ธฐ, ์ฐ๊ธฐ ๋๋ ๋ ๋ค๋ฅผ ์ํด)
- ๋ฐ์ดํฐ ์ฝ๊ธฐ ๋ฐ/๋๋ ์ฐ๊ธฐ
- ํ์ผ ๋ซ๊ธฐ
๊ฐ๋จํ ์์ ๋ฅผ ์ดํด๋ณผ๊น์?
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::fstream file("data.txt", std::ios::in | std::ios::out | std::ios::app);
if (file.is_open()) {
// ํ์ผ์ ์ฐ๊ธฐ
file << "fstream์ ์ ๋ง ์ ์ฉํด์!" << std::endl;
// ํ์ผ ํฌ์ธํฐ๋ฅผ ์ฒ์์ผ๋ก ์ด๋
file.seekg(0, std::ios::beg);
// ํ์ผ ์ฝ๊ธฐ
std::string line;
while (std::getline(file, line)) {
std::cout << line << std::endl;
}
file.close();
} else {
std::cout << "ํ์ผ์ ์ด ์ ์์ต๋๋ค!" << std::endl;
}
return 0;
}
์ด ์ฝ๋๋ "data.txt" ํ์ผ์ ์ด๊ณ , ์๋ก์ด ๋ด์ฉ์ ์ถ๊ฐํ ํ, ํ์ผ์ ๋ชจ๋ ๋ด์ฉ์ ์ฝ์ด ํ๋ฉด์ ์ถ๋ ฅํฉ๋๋ค. ๋ง์น ์ฌ๋ฅ๋ท์์ ์๋ก์ด ์ฌ๋ฅ์ ๋ฑ๋กํ๊ณ ๋์์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฌ๋ฅ์ ๋๋ฌ๋ณด๋ ๊ฒ๊ณผ ๊ฐ์ฃ ! ๐
๐ก ํ: fstream์ ์ฌ์ฉํ ๋๋ ํ์ผ ๋ชจ๋๋ฅผ ์ง์ ํ ์ ์์ด์. std::ios::in
(์ฝ๊ธฐ), std::ios::out
(์ฐ๊ธฐ), std::ios::app
(์ถ๊ฐ) ๋ฑ์ ๋ชจ๋๋ฅผ ์กฐํฉํด์ ์ฌ์ฉํ ์ ์๋ต๋๋ค!
์, ์ด์ fstream์ ๊ธฐ๋ณธ์ ์์๋ณด์์ต๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ์์์ ๋ถ๊ณผํด์! ๋ค์ ์น์ ์์๋ ๋ ๊น์ด ์๋ ๋ด์ฉ์ ๋ค๋ค๋ณผ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๊ณ์ํด์ fstream์ ๋ง๋ฒ ๊ฐ์ ์ธ๊ณ๋ฅผ ํํํด๋ด ์๋ค! ๐
2. fstream์ ๊ณ ๊ธ ๊ธฐ๋ฅ: ํ์ผ ๋ง๋ฒ์ฌ๋ก ๋ ๋ฒจ ์ ! ๐งโโ๏ธโจ
๊ธฐ๋ณธ์ ๋ง์คํฐํ์ จ๋์? ์ด์ fstream์ ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ณผ ์๊ฐ์ ๋๋ค! ์ด ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ์ตํ๋ฉด, ์ฌ๋ฌ๋ถ์ ์ง์ ํ ํ์ผ ์ ์ถ๋ ฅ์ ๋ง๋ฒ์ฌ๊ฐ ๋ ์ ์์ด์. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ฌ๋ฌ ๊ฐ์ง ์ฌ๋ฅ์ ์กฐํฉํด ์๋ก์ด ๊ฐ์น๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ ! ๐
2.1 ํ์ผ ํฌ์ธํฐ ์กฐ์: ์๊ฐ ์ฌํ์์ฒ๋ผ ํ์ผ ๋ด ์ด๋ํ๊ธฐ ๐ฐ๏ธ
ํ์ผ ํฌ์ธํฐ๋ ํ์ฌ ํ์ผ์์ ์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ ์์ ์ ์ํํ ์์น๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ์ด ํฌ์ธํฐ๋ฅผ ์์ ์์ฌ๋ก ์์ง์ผ ์ ์๋ค๋ฉด, ํ์ผ์ ์ด๋ ๋ถ๋ถ์ด๋ ์ ๊ทผํ ์ ์๊ฒ ์ฃ ?
์ฃผ์ ํ์ผ ํฌ์ธํฐ ์กฐ์ ํจ์๋ค:
- seekg(): ์ฝ๊ธฐ ํฌ์ธํฐ ์ด๋ (get)
- seekp(): ์ฐ๊ธฐ ํฌ์ธํฐ ์ด๋ (put)
- tellg(): ํ์ฌ ์ฝ๊ธฐ ํฌ์ธํฐ ์์น ๋ฐํ
- tellp(): ํ์ฌ ์ฐ๊ธฐ ํฌ์ธํฐ ์์น ๋ฐํ
์์ ๋ฅผ ํตํด ์ดํด๋ณผ๊น์?
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::fstream file("timetravel.txt", std::ios::in | std::ios::out | std::ios::trunc);
if (file.is_open()) {
// ํ์ผ์ ๋ฐ์ดํฐ ์ฐ๊ธฐ
file << "Hello, Time Traveler!" << std::endl;
file << "Welcome to the world of fstream!" << std::endl;
// ํ์ผ ํฌ์ธํฐ๋ฅผ ์์์ผ๋ก ์ด๋
file.seekg(0, std::ios::beg);
// ์ฒซ ๋ฒ์งธ ์ค ์ฝ๊ธฐ
std::string line;
std::getline(file, line);
std::cout << "First line: " << line << std::endl;
// ๋ ๋ฒ์งธ ์ค์ ์์์ผ๋ก ์ด๋
file.seekg(0, std::ios::beg);
file.seekg(line.length() + 1, std::ios::cur);
// ๋ ๋ฒ์งธ ์ค ์ฝ๊ธฐ
std::getline(file, line);
std::cout << "Second line: " << line << std::endl;
// ํ์ผ์ ๋์ผ๋ก ์ด๋ํ์ฌ ์๋ก์ด ๋ด์ฉ ์ถ๊ฐ
file.seekp(0, std::ios::end);
file << "This line was added at the end!" << std::endl;
file.close();
} else {
std::cout << "Unable to open file!" << std::endl;
}
return 0;
}
์ด ์์ ์์๋ ํ์ผ ํฌ์ธํฐ๋ฅผ ์์ ์์ฌ๋ก ์์ง์ด๋ฉฐ ํ์ผ์ ๋ค์ํ ์์น์์ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ฅผ ์ํํฉ๋๋ค. ๋ง์น ํ์๋จธ์ ์ ํ๊ณ ํ์ผ ๋ด์ฉ์ ํํํ๋ ๊ฒ ๊ฐ์ง ์๋์? ๐
๐ ์ฃผ์์ฌํญ: seekg()์ seekp()๋ฅผ ์ฌ์ฉํ ๋๋ ํ์ผ ๋ชจ๋(์ฝ๊ธฐ/์ฐ๊ธฐ)์ ์ผ์นํ๋์ง ํ์ธํด์ผ ํด์. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์๋ต๋๋ค!
2.2 ๋ฐ์ด๋๋ฆฌ ๋ชจ๋: ๋นํธ์ ๋ฐ์ดํธ์ ์ธ๊ณ๋ก! ๐ฅ๏ธ
์ง๊ธ๊น์ง๋ ํ ์คํธ ํ์ผ์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์์ต๋๋ค. ํ์ง๋ง ๋๋ก๋ ์ด๋ฏธ์ง, ์์ ํ์ผ ๋ฑ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ค์ผ ํ ๋๋ ์์ฃ . ์ด๋ด ๋ ๋ฐ์ด๋๋ฆฌ ๋ชจ๋๊ฐ ํ์ํฉ๋๋ค!
๋ฐ์ด๋๋ฆฌ ๋ชจ๋ ์ฌ์ฉ ๋ฐฉ๋ฒ:
std::fstream file("data.bin", std::ios::in | std::ios::out | std::ios::binary);
๋ฐ์ด๋๋ฆฌ ๋ชจ๋์์๋ read()์ write() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์๋๋ค. ์์ ๋ฅผ ํตํด ์ดํด๋ณผ๊น์?
#include <iostream>
#include <fstream>
#include <vector>
struct Person {
char name[50];
int age;
};
int main() {
std::fstream file("people.bin", std::ios::in | std::ios::out | std::ios::binary | std::ios::trunc);
if (file.is_open()) {
// ๋ฐ์ดํฐ ์ฐ๊ธฐ
Person p1 = {"Alice", 25};
Person p2 = {"Bob", 30};
file.write(reinterpret_cast<char*>(&p1), sizeof(Person));
file.write(reinterpret_cast<char*>(&p2), sizeof(Person));
// ํ์ผ ํฌ์ธํฐ๋ฅผ ์์์ผ๋ก ์ด๋
file.seekg(0, std::ios::beg);
// ๋ฐ์ดํฐ ์ฝ๊ธฐ
std::vector<Person> people;
Person temp;
while (file.read(reinterpret_cast<char*>(&temp), sizeof(Person))) {
people.push_back(temp);
}
// ์ฝ์ ๋ฐ์ดํฐ ์ถ๋ ฅ
for (const auto& person : people) {
std::cout << "Name: " << person.name << ", Age: " << person.age << std::endl;
}
file.close();
} else {
std::cout << "Unable to open file!" << std::endl;
}
return 0;
}
์ด ์์ ์์๋ Person ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ์ด๋๋ฆฌ ํํ๋ก ํ์ผ์ ์ ์ฅํ๊ณ ๋ค์ ์ฝ์ด์ต๋๋ค. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ฌ์ฉ์ ํ๋กํ์ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ ๋ถ๋ฌ์ค๋ ๊ฒ๊ณผ ๋น์ทํ์ฃ ? ๐
๐ก ํ: ๋ฐ์ด๋๋ฆฌ ๋ชจ๋๋ฅผ ์ฌ์ฉํ ๋๋ ํ๋ซํผ ๊ฐ์ ์ฐจ์ด(์๋์, ๊ตฌ์กฐ์ฒด ํจ๋ฉ ๋ฑ)๋ฅผ ๊ณ ๋ คํด์ผ ํด์. ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ์ด ํ์ํ๋ค๋ฉด ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ ์๋ต๋๋ค!
2.3 ์๋ฌ ์ฒ๋ฆฌ: ํ์ผ ๋ง๋ฒ์ฌ์ ์์ ๋ง ๐ก๏ธ
ํ์ผ ์ ์ถ๋ ฅ ์์ ์ค์๋ ๋ค์ํ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์๋ฌ๋ฅผ ์ ์ ํ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํด์. fstream์ ๋ค์ํ ์๋ฌ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
์ฃผ์ ์๋ฌ ์ฒ๋ฆฌ ํจ์๋ค:
- good(): ์คํธ๋ฆผ์ด ์ ์ ์ํ์ธ์ง ํ์ธ
- eof(): ํ์ผ์ ๋์ ๋๋ฌํ๋์ง ํ์ธ
- fail(): ๋ง์ง๋ง ์ ์ถ๋ ฅ ์์ ์ด ์คํจํ๋์ง ํ์ธ
- bad(): ์ฌ๊ฐํ ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง ํ์ธ
- clear(): ์๋ฌ ํ๋๊ทธ ์ด๊ธฐํ
์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํฌํจํ ์์ ๋ฅผ ์ดํด๋ณผ๊น์?
#include <iostream>
#include <fstream>
#include <string>
void processFile(const std::string& filename) {
std::fstream file(filename, std::ios::in | std::ios::out);
if (!file) {
std::cerr << "Error opening file: " << filename << std::endl;
return;
}
std::string line;
while (std::getline(file, line)) {
if (file.fail() && !file.eof()) {
std::cerr << "Error reading file!" << std::endl;
file.clear(); // ์๋ฌ ํ๋๊ทธ ์ด๊ธฐํ
break;
}
std::cout << line << std::endl;
}
if (file.bad()) {
std::cerr << "Critical error occurred!" << std::endl;
}
file.close();
if (file.fail()) {
std::cerr << "Error closing file!" << std::endl;
}
}
int main() {
processFile("example.txt");
return 0;
}
์ด ์์ ์์๋ ํ์ผ ์ด๊ธฐ, ์ฝ๊ธฐ, ๋ซ๊ธฐ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ๋ค์ํ ์๋ฌ ์ํฉ์ ์ฒ๋ฆฌํฉ๋๋ค. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ ๊ฒ๊ณผ ๊ฐ์ฃ ? ๐ก๏ธ
โ ๏ธ ์ฃผ์: ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ๋ฌด์ํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์์์น ๋ชปํ ๋ฐฉ์์ผ๋ก ๋์ํ ์ ์์ด์. ํญ์ ์ ์ ํ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํฌํจ์ํค๋ ๊ฒ์ด ์ข์ต๋๋ค!
2.4 ํ์ผ ๋ฒํผ๋ง: ์ฑ๋ฅ์ ๋น๋ฐ ๐
fstream์ ๋ด๋ถ์ ์ผ๋ก ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ์ ์ถ๋ ฅ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ํ์ง๋ง ๋๋ก๋ ์ด ๋ฒํผ๋ง ๋์์ ์ง์ ์ ์ดํด์ผ ํ ๋๊ฐ ์์ฃ .
๋ฒํผ ๊ด๋ จ ์ฃผ์ ํจ์๋ค:
- sync(): ๋ฒํผ์ ๋ด์ฉ์ ์ฆ์ ํ์ผ์ ์ฐ๊ธฐ
- flush(): ์ถ๋ ฅ ๋ฒํผ๋ฅผ ๋น์ฐ๊ณ ๋ด์ฉ์ ํ์ผ์ ์ฐ๊ธฐ
- rdbuf()->pubsetbuf(): ์ฌ์ฉ์ ์ ์ ๋ฒํผ ์ค์
๋ฒํผ ์กฐ์ ์์ ๋ฅผ ๋ณผ๊น์?
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::fstream file("buffer_example.txt", std::ios::in | std::ios::out | std::ios::trunc);
if (file.is_open()) {
// ๋ฐ์ดํฐ ์ฐ๊ธฐ
file << "This is a test of buffering." << std::endl;
// ๋ฒํผ๋ฅผ ์ฆ์ ๋น์ฐ๊ธฐ
file.flush();
// ํ์ผ ํฌ์ธํฐ๋ฅผ ์์์ผ๋ก ์ด๋
file.seekg(0, std::ios::beg);
// ๋ฐ์ดํฐ ์ฝ๊ธฐ
std::string line;
std::getline(file, line);
std::cout << "Read from file: " << line << std::endl;
// ์ฌ์ฉ์ ์ ์ ๋ฒํผ ์ค์ (์ด ์์ ์์๋ ๋ฒํผ๋ง ๋นํ์ฑํ)
file.rdbuf()->pubsetbuf(0, 0);
// ์ถ๊ฐ ๋ฐ์ดํฐ ์ฐ๊ธฐ (์ด์ ๋ฒํผ๋ง ์์ด ์ง์ ํ์ผ์ ์ฐ์ฌ์ง)
file << "This line is written without buffering." << std::endl;
file.close();
} else {
std::cout << "Unable to open file!" << std::endl;
}
return 0;
}
์ด ์์ ์์๋ ๋ฒํผ๋ฅผ ์๋์ผ๋ก ๋น์ฐ๊ณ , ์ฌ์ง์ด ๋ฒํผ๋ง์ ์์ ํ ๋นํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด๋ ๋ง์น ์ฌ๋ฅ๋ท์์ ์ค์๊ฐ ์ฑํ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ๋ฉ์์ง๊ฐ ์ฆ์ ์ ์ก๋๋๋ก ํ๋ ๊ฒ๊ณผ ๋น์ทํ์ฃ ! ๐จ
๐ก ํ: ๋ฒํผ๋ง์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ํฅ์์ํค์ง๋ง, ์ค์๊ฐ์ฑ์ด ์ค์ํ ๊ฒฝ์ฐ์๋ ๋ฒํผ๋ง์ ์กฐ์ ํ๊ฑฐ๋ ๋นํ์ฑํํ ์ ์์ด์. ํ์ง๋ง ์ด๋ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ผ๋ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค!
์, ์ด์ fstream์ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ณด์์ต๋๋ค. ์ด ๊ธฐ๋ฅ๋ค์ ๋ง์คํฐํ๋ฉด, ์ฌ๋ฌ๋ถ์ ์ง์ ํ ํ์ผ ์ ์ถ๋ ฅ์ ๋ง๋ฒ์ฌ๊ฐ ๋ ์ ์์ด์! ๋ค์ ์น์ ์์๋ ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ์ค์ ์ํฉ์์ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. ์ค๋น๋์ จ๋์? ๊ณ์ํด์ fstream์ ๋ง๋ฒ ๊ฐ์ ์ธ๊ณ๋ฅผ ํํํด๋ด ์๋ค! ๐งโโ๏ธโจ
3. fstream์ ์ค์ ์์ฉ: ํ์ผ ๋ง๋ฒ์ฌ์ ๋ชจํ ๐๏ธ
์, ์ด์ ์ฐ๋ฆฌ๋ fstream์ ๊ธฐ๋ณธ๊ณผ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ๋ง์คํฐํ์ต๋๋ค. ํ์ง๋ง ์ง์ ํ ๋ง๋ฒ์ฌ๋ ์ด ์ง์์ ์ค์ ์ํฉ์ ์ ์ฉํ ์ค ์์์ผ ํ์ฃ ! ์ด๋ฒ ์น์ ์์๋ fstream์ ์ฌ์ฉํ ์ค์ ์์ฉ ์ฌ๋ก๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ๋ค์ด ์ค์ ํ๋ก์ ํธ์ ์ ์ฉ๋๋ ๊ฒ์ฒ๋ผ ๋ง์ด์์! ๐
3.1 ๊ฐ๋จํ ํ ์คํธ ์๋ํฐ ๋ง๋ค๊ธฐ ๐
์ฒซ ๋ฒ์งธ ํ๋ก์ ํธ๋ก, fstream์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ํ ์คํธ ์๋ํฐ๋ฅผ ๋ง๋ค์ด ๋ณผ๊น์? ์ด ์๋ํฐ๋ ํ์ผ์ ์ด๊ณ , ๋ด์ฉ์ ์์ ํ๊ณ , ์ ์ฅํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ๊ฑฐ์์.
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
class SimpleTextEditor {
private:
std::string filename;
std::vector<std::string> lines;
public:
SimpleTextEditor(const std::string& fname) : filename(fname) {}
void readFile() {
std::ifstream file(filename);
if (file.is_open()) {
std::string line;
while (std::getline(file, line)) {
lines.push_back(line);
}
file.close();
std::cout << "File ์ฝ๊ธฐ ์๋ฃ!" << std::endl;
} else {
std::cout << "์ ํ์ผ์ ์์ฑํฉ๋๋ค." << std::endl;
}
}
void writeFile() {
std::ofstream file(filename);
if (file.is_open()) {
for (const auto& line : lines) {
file << line << std::endl;
}
file.close();
std::cout << "ํ์ผ ์ ์ฅ ์๋ฃ!" << std::endl;
} else {
std::cout << "ํ์ผ์ ์ ์ฅํ ์ ์์ต๋๋ค!" << std::endl;
}
}
void editFile() {
std::cout << "ํ
์คํธ๋ฅผ ์
๋ ฅํ์ธ์. ์
๋ ฅ์ ๋ง์น๋ ค๋ฉด ๋น ์ค์ ์
๋ ฅํ์ธ์:" << std::endl;
std::string line;
while (std::getline(std::cin, line) && !line.empty()) {
lines.push_back(line);
}
}
void displayFile() {
std::cout << "ํ์ผ ๋ด์ฉ:" << std::endl;
for (const auto& line : lines) {
std::cout << line << std::endl;
}
}
};
int main() {
std::string filename;
std::cout << "ํธ์งํ ํ์ผ ์ด๋ฆ์ ์
๋ ฅํ์ธ์: ";
std::cin >> filename;
SimpleTextEditor editor(filename);
editor.readFile();
editor.editFile();
editor.writeFile();
editor.displayFile();
return 0;
}
์ด ๊ฐ๋จํ ํ ์คํธ ์๋ํฐ๋ fstream์ ๋ค์ํ ๊ธฐ๋ฅ์ ํ์ฉํฉ๋๋ค. ifstream์ผ๋ก ํ์ผ์ ์ฝ๊ณ , ofstream์ผ๋ก ํ์ผ์ ์ฐ๋ฉฐ, ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ ํ์ผ์ ์์ ํ ์ ์์ฃ . ๋ง์น ์ฌ๋ฅ๋ท์์ ์ฌ์ฉ์ ํ๋กํ์ ์์ ํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค! ๐
3.2 ๋ก๊ทธ ์์คํ ๊ตฌํํ๊ธฐ ๐
๋ค์์ผ๋ก, fstream์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ๋ก๊ทธ ์์คํ ์ ๊ตฌํํด ๋ณผ๊น์? ์ด ์์คํ ์ ํ๋ก๊ทธ๋จ์ ์คํ ๊ณผ์ ์ ํ์ผ์ ๊ธฐ๋กํ๊ณ , ํ์ํ ๋ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์๊ฒ ํด์ค๋๋ค.
#include <iostream>
#include <fstream>
#include <string>
#include <chrono>
#include <iomanip>
class Logger {
private:
std::string filename;
std::ofstream logfile;
public:
Logger(const std::string& fname) : filename(fname) {
logfile.open(filename, std::ios::app);
if (!logfile.is_open()) {
std::cerr << "๋ก๊ทธ ํ์ผ์ ์ด ์ ์์ต๋๋ค!" << std::endl;
}
}
~Logger() {
if (logfile.is_open()) {
logfile.close();
}
}
void log(const std::string& message) {
if (logfile.is_open()) {
auto now = std::chrono::system_clock::now();
auto now_c = std::chrono::system_clock::to_time_t(now);
logfile << std::put_time(std::localtime(&now_c), "%Y-%m-%d %H:%M:%S")
<< " - " << message << std::endl;
logfile.flush(); // ์ฆ์ ํ์ผ์ ์ฐ๊ธฐ
}
}
void displayLog() {
std::ifstream infile(filename);
if (infile.is_open()) {
std::string line;
while (std::getline(infile, line)) {
std::cout << line << std::endl;
}
infile.close();
} else {
std::cout << "๋ก๊ทธ ํ์ผ์ ์ด ์ ์์ต๋๋ค!" << std::endl;
}
}
};
int main() {
Logger logger("application.log");
logger.log("ํ๋ก๊ทธ๋จ ์์");
// ์ฌ๊ธฐ์ ํ๋ก๊ทธ๋จ์ ์ฃผ์ ๋ก์ง์ ๊ตฌํํฉ๋๋ค
logger.log("์ค์ํ ์์
์ํ ์ค...");
logger.log("์์
์๋ฃ");
logger.log("ํ๋ก๊ทธ๋จ ์ข
๋ฃ");
std::cout << "๋ก๊ทธ ๋ด์ฉ:" << std::endl;
logger.displayLog();
return 0;
}
์ด ๋ก๊ทธ ์์คํ ์ fstream์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ๋ฅผ ํ์ผ์ ๊ธฐ๋กํ๊ณ , ํ์ํ ๋ ์ฝ์ด์ฌ ์ ์์ต๋๋ค. ์๊ฐ ์ ๋ณด๋ ํจ๊ป ๊ธฐ๋กํ์ฌ ๋ก๊ทธ์ ์ ํ์ฑ์ ๋์์ฃ . ์ด๋ ๋ง์น ์ฌ๋ฅ๋ท์์ ์ฌ์ฉ์ ํ๋ ๊ธฐ๋ก์ ๊ด๋ฆฌํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค! ๐
3.3 ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ๊ตฌํํ๊ธฐ ๐๏ธ
๋ง์ง๋ง์ผ๋ก, fstream์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ๊ตฌํํด ๋ณผ๊น์? ์ด ์์คํ ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ผ์ ์ ์ฅํ๊ณ , ๊ฒ์ํ๊ณ , ์์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
struct User {
int id;
std::string name;
int age;
};
class SimpleDB {
private:
std::string filename;
std::vector<User> users;
public:
SimpleDB(const std::string& fname) : filename(fname) {
loadUsers();
}
void loadUsers() {
std::ifstream file(filename, std::ios::binary);
if (file.is_open()) {
User user;
while (file.read(reinterpret_cast<char*>(&user), sizeof(User))) {
users.push_back(user);
}
file.close();
}
}
void saveUsers() {
std::ofstream file(filename, std::ios::binary | std::ios::trunc);
if (file.is_open()) {
for (const auto& user : users) {
file.write(reinterpret_cast<const char*>(&user), sizeof(User));
}
file.close();
}
}
void addUser(const std::string& name, int age) {
int newId = users.empty() ? 1 : users.back().id + 1;
users.push_back({newId, name, age});
saveUsers();
}
User* findUser(int id) {
auto it = std::find_if(users.begin(), users.end(),
[id](const User& u) { return u.id == id; });
return it != users.end() ? &(*it) : nullptr;
}
void updateUser(int id, const std::string& name, int age) {
if (User* user = findUser(id)) {
user->name = name;
user->age = age;
saveUsers();
}
}
void deleteUser(int id) {
users.erase(std::remove_if(users.begin(), users.end(),
[id](const User& u) { return u.id == id; }),
users.end());
saveUsers();
}
void displayAllUsers() {
for (const auto& user : users) {
std::cout << "ID: " << user.id << ", Name: " << user.name
<< ", Age: " << user.age << std::endl;
}
}
};
int main() {
SimpleDB db("users.dat");
db.addUser("Alice", 25);
db.addUser("Bob", 30);
db.addUser("Charlie", 35);
std::cout << "All users:" << std::endl;
db.displayAllUsers();
db.updateUser(2, "Bobby", 31);
db.deleteUser(3);
std::cout << "\nAfter updates:" << std::endl;
db.displayAllUsers();
return 0;
}
์ด ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ fstream์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์ด๋๋ฆฌ ํ์์ผ๋ก ํ์ผ์ ์ ์ฅํ๊ณ ์ฝ์ด์ต๋๋ค. CRUD(Create, Read, Update, Delete) ์ฐ์ฐ์ ๋ชจ๋ ๊ตฌํํ์ฃ . ์ด๋ ๋ง์น ์ฌ๋ฅ๋ท์์ ์ฌ์ฉ์ ํ๋กํ์ ๊ด๋ฆฌํ๋ ๋ฐฑ์๋ ์์คํ ๊ณผ ์ ์ฌํฉ๋๋ค! ๐๏ธ
๐ก ํ: ์ค์ ํ๋ก๋์ ํ๊ฒฝ์์๋ ๋ณด์, ๋์์ฑ, ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ฑ ๋ ๋ง์ ์์๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ด ์์ ๋ค์ fstream์ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๊ฒ์ด์์!
์ด๋ ๊ฒ fstream์ ์ฌ์ฉํ ์ค์ ์์ฉ ์ฌ๋ก๋ค์ ์ดํด๋ณด์์ต๋๋ค. ์ด ์์ ๋ค์ ํตํด fstream์ด ์ผ๋ง๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฉํ ๋๊ตฌ์ธ์ง ๋๋ผ์ จ๋์? ํ์ผ ์ ์ถ๋ ฅ์ ๊ฑฐ์ ๋ชจ๋ ํ๋ก๊ทธ๋จ์์ ์ค์ํ ์ญํ ์ ํ๋ฏ๋ก, ์ด๋ฌํ ๊ธฐ์ ์ ๋ง์คํฐํ๋ฉด ์ฌ๋ฌ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ๋ฅ๋ ฅ์ด ํ์ธต ๋ ๋ฐ์ ํ ๊ฑฐ์์! ๐
์, ์ด์ ์ฐ๋ฆฌ์ fstream ์ฌํ์ด ๊ฑฐ์ ๋๋๊ฐ๋๋ค. ๋ง์ง๋ง ์น์ ์์๋ fstream ์ฌ์ฉ ์ ์ฃผ์ํด์ผ ํ ์ ๋ค๊ณผ ๋ฒ ์คํธ ํ๋ํฐ์ค์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ค๋น๋์ จ๋์? ๊ณ์ํด์ fstream์ ๋ง๋ฒ ๊ฐ์ ์ธ๊ณ๋ฅผ ํํํด๋ด ์๋ค! ๐งโโ๏ธโจ
4. fstream ์ฌ์ฉ ์ ์ฃผ์์ฌํญ ๋ฐ ๋ฒ ์คํธ ํ๋ํฐ์ค ๐ก๏ธ
fstream์ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ์๋ชป ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด ์น์ ์์๋ fstream์ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํ ์ฃผ์์ฌํญ๊ณผ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค. ๋ง์น ์ฌ๋ฅ๋ท์์ ์์ ํ๊ณ ํจ์จ์ ์ธ ์๋น์ค ์ด์์ ์ํ ๊ฐ์ด๋๋ผ์ธ์ ์ ์ํ๋ ๊ฒ๊ณผ ๊ฐ์ฃ ! ๐
4.1 ํญ์ ํ์ผ์ ๋ซ์์ฃผ์ธ์ ๐ช
ํ์ผ์ ์ด์๋ค๋ฉด ๋ฐ๋์ ๋ซ์์ฃผ์ด์ผ ํฉ๋๋ค. ํ์ผ์ ๋ซ์ง ์์ผ๋ฉด ๋ฆฌ์์ค ๋์๊ฐ ๋ฐ์ํ ์ ์๊ณ , ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ํด๋น ํ์ผ์ ์ ๊ทผํ์ง ๋ชปํ ์ ์์ต๋๋ค.
std::fstream file("example.txt", std::ios::in | std::ios::out);
if (file.is_open()) {
// ํ์ผ ์์
์ํ
file.close(); // ์์
์ด ๋๋๋ฉด ๋ฐ๋์ ํ์ผ์ ๋ซ์์ฃผ์ธ์
}
๋ ์ข์ ๋ฐฉ๋ฒ์ RAII(Resource Acquisition Is Initialization) ์์น์ ๋ฐ๋ฅด๋ ๊ฒ์ ๋๋ค. fstream ๊ฐ์ฒด๊ฐ ์ค์ฝํ๋ฅผ ๋ฒ์ด๋๋ฉด ์๋์ผ๋ก ํ์ผ์ด ๋ซํ๋๋ค.
{
std::fstream file("example.txt", std::ios::in | std::ios::out);
if (file.is_open()) {
// ํ์ผ ์์
์ํ
}
} // ์ค์ฝํ๋ฅผ ๋ฒ์ด๋๋ฉด file ๊ฐ์ฒด๊ฐ ์๋ฉธ๋๋ฉฐ ์๋์ผ๋ก ํ์ผ์ด ๋ซํ๋๋ค
4.2 ์์ธ ์ฒ๋ฆฌ๋ฅผ ์์ง ๋ง์ธ์ ๐ญ
ํ์ผ ์์ ์ค์๋ ๋ค์ํ ์์ธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ธ๋ฅผ ์ ์ ํ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ด ์๊ธฐ์น ์๊ฒ ์ข ๋ฃ๋ ์ ์์ต๋๋ค.
try {
std::fstream file("example.txt", std::ios::in | std::ios::out);
if (!file.is_open()) {
throw std::runtime_error("ํ์ผ์ ์ด ์ ์์ต๋๋ค.");
}
// ํ์ผ ์์
์ํ
} catch (const std::exception& e) {
std::cerr << "์๋ฌ ๋ฐ์: " << e.what() << std::endl;
}
4.3 ํ์ผ ๋ชจ๋๋ฅผ ์ ์คํ ์ ํํ์ธ์ ๐๏ธ
ํ์ผ์ ์ด ๋ ์ ์ ํ ๋ชจ๋๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ชป๋ ๋ชจ๋ ์ ํ์ ์๋ํ์ง ์์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
// ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ํ์ผ ์ด๊ธฐ
std::ifstream inFile("input.txt", std::ios::in);
// ์ฐ๊ธฐ ์ ์ฉ์ผ๋ก ํ์ผ ์ด๊ธฐ (๊ธฐ์กด ๋ด์ฉ ์ญ์ )
std::ofstream outFile("output.txt", std::ios::out | std::ios::trunc);
// ์ฝ๊ธฐ์ ์ฐ๊ธฐ ๋ชจ๋ ๊ฐ๋ฅํ๊ฒ ํ์ผ ์ด๊ธฐ (๊ธฐ์กด ๋ด์ฉ ์ ์ง)
std::fstream ioFile("data.txt", std::ios::in | std::ios::out | std::ios::app);
4.4 ๋ฒํผ ๊ด๋ฆฌ์ ์ฃผ์ํ์ธ์ ๐งบ
๋ฒํผ๋ง์ ์ฑ๋ฅ์ ํฅ์์ํค์ง๋ง, ์ค์๊ฐ์ฑ์ด ์ค์ํ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ํ์์ ๋ฐ๋ผ ๋ฒํผ๋ฅผ ์ ์ ํ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
std::ofstream file("log.txt", std::ios::app);
file << "์ค์ํ ๋ก๊ทธ ๋ฉ์์ง" << std::endl; // std::endl์ ๋ฒํผ๋ฅผ ๋น์ฐ๊ณ ๊ฐํํฉ๋๋ค
file.flush(); // ๋ช
์์ ์ผ๋ก ๋ฒํผ๋ฅผ ๋น์๋๋ค
4.5 ๋์ฉ๋ ํ์ผ ์ฒ๋ฆฌ ์ ์ฃผ์ํ์ธ์ ๐
๋์ฉ๋ ํ์ผ์ ์ฒ๋ฆฌํ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ฃผ์ํด์ผ ํฉ๋๋ค. ํ์ผ ์ ์ฒด๋ฅผ ํ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ๊ฒ์ ํผํ๊ณ , ์ฒญํฌ ๋จ์๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
std::ifstream file("large_file.dat", std::ios::binary);
if (file.is_open()) {
const int CHUNK_SIZE = 4096;
char buffer[CHUNK_SIZE];
while (file.read(buffer, CHUNK_SIZE)) {
// ์ฒญํฌ ๋จ์๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ
}
// ๋ง์ง๋ง ์ฒญํฌ ์ฒ๋ฆฌ
std::streamsize bytesRead = file.gcount();
if (bytesRead > 0) {
// ๋จ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
}
}
4.6 ํ์ผ ๊ฒฝ๋ก์ ๊ถํ์ ์ฃผ์ํ์ธ์ ๐
ํ์ผ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฐ๋ฅธ์ง, ๊ทธ๋ฆฌ๊ณ ํ๋ก๊ทธ๋จ์ด ํด๋น ํ์ผ์ ๋ํ ์ ์ ํ ๊ถํ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
std::fstream file("C:\\Users\\YourName\\Documents\\data.txt", std::ios::in | std::ios::out);
if (!file.is_open()) {
std::cerr << "ํ์ผ์ ์ด ์ ์์ต๋๋ค. ๊ฒฝ๋ก์ ๊ถํ์ ํ์ธํ์ธ์." << std::endl;
}
4.7 ์ด๋ ์๋ฏธ๋ก (Move Semantics)์ ํ์ฉํ์ธ์ ๐โโ๏ธ
C++11 ์ด์์์๋ ์ด๋ ์๋ฏธ๋ก ์ ์ฌ์ฉํ์ฌ fstream ๊ฐ์ฒด๋ฅผ ํจ์จ์ ์ผ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
std::fstream createFile(const std::string& filename) {
return std::fstream(filename, std::ios::in | std::ios::out);
}
std::fstream file = createFile("example.txt"); // ์ด๋ ์์ฑ์ ํธ์ถ
4.8 ์ค๋ ๋ ์์ ์ฑ์ ์ฃผ์ํ์ธ์ ๐งต
fstream์ ์ค๋ ๋ ์์ ํ์ง ์์ต๋๋ค. ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ fstream์ ์ฌ์ฉํ ๋๋ ์ ์ ํ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
#include <mutex>
std::mutex fileMutex;
std::fstream file("shared_file.txt", std::ios::in | std::ios::out | std::ios::app);
void writeToFile(const std::string& data) {
std::lock_guard<std::mutex> lock(fileMutex);
file << data << std::endl;
}
๐ ์ฃผ์์ฌํญ: ์ด๋ฌํ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ค์ ๋ฐ๋ฅด๋ฉด fstream์ ๋ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ฐ ์ํฉ์ ๋ง๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํด์!
์ด๋ ๊ฒ fstream ์ฌ์ฉ ์ ์ฃผ์ํด์ผ ํ ์ ๋ค๊ณผ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ์์๋ณด์์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ฅด๋ฉด ์ฌ๋ฌ๋ถ์ ํ์ผ ์ ์ถ๋ ฅ ์ฝ๋๊ฐ ๋์ฑ ์์ ์ ์ด๊ณ ํจ์จ์ ์ผ๋ก ๋์ํ ๊ฑฐ์์. ๋ง์น ์ฌ๋ฅ๋ท์ด ์์ ํ๊ณ ํจ์จ์ ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ ! ๐
์, ์ด์ ์ฐ๋ฆฌ์ fstream ์ฌํ์ด ๋๋๊ฐ๋๋ค. fstream์ ๊ธฐ๋ณธ๋ถํฐ ๊ณ ๊ธ ๊ธฐ๋ฅ, ์ค์ ์์ฉ ์ฌ๋ก, ๊ทธ๋ฆฌ๊ณ ์ฃผ์์ฌํญ๊น์ง ๋ชจ๋ ์ดํด๋ณด์์ต๋๋ค. ์ด์ ์ฌ๋ฌ๋ถ์ ํ์ผ ์ ์ถ๋ ฅ์ ์ง์ ํ ๋ง๋ฒ์ฌ๊ฐ ๋์์ต๋๋ค! ๐งโโ๏ธโจ ์ด ์ง์์ ํ์ฉํ์ฌ ๋์ฑ ๊ฐ๋ ฅํ๊ณ ์ ์ฉํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ณด์ธ์. ์ฌ๋ฌ๋ถ์ ์ฝ๋ฉ ์ฌ์ ์ ํ์ด์ด ํจ๊ปํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค! ๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ