๐Ÿš€ ํŒŒ์ผ ์ž…์ถœ๋ ฅ์˜ ๋งˆ๋ฒ•์‚ฌ: fstream ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™„์ „ ์ •๋ณต! ๐Ÿง™โ€โ™‚๏ธ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ํŒŒ์ผ ์ž…์ถœ๋ ฅ์˜ ๋งˆ๋ฒ•์‚ฌ: 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 ์‚ฌ์šฉ์˜ ๊ธฐ๋ณธ ๋‹จ๊ณ„:

  1. ifstream ๊ฐ์ฒด ์ƒ์„ฑ
  2. ํŒŒ์ผ ์—ด๊ธฐ
  3. ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
  4. ํŒŒ์ผ ๋‹ซ๊ธฐ

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณผ๊นŒ์š”?


#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 ์‚ฌ์šฉ์˜ ๊ธฐ๋ณธ ๋‹จ๊ณ„:

  1. ofstream ๊ฐ์ฒด ์ƒ์„ฑ
  2. ํŒŒ์ผ ์—ด๊ธฐ (์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ)
  3. ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ
  4. ํŒŒ์ผ ๋‹ซ๊ธฐ

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ์š”?


#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 ์‚ฌ์šฉ์˜ ๊ธฐ๋ณธ ๋‹จ๊ณ„:

  1. fstream ๊ฐ์ฒด ์ƒ์„ฑ
  2. ํŒŒ์ผ ์—ด๊ธฐ (์ฝ๊ธฐ, ์“ฐ๊ธฐ ๋˜๋Š” ๋‘˜ ๋‹ค๋ฅผ ์œ„ํ•ด)
  3. ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ๋ฐ/๋˜๋Š” ์“ฐ๊ธฐ
  4. ํŒŒ์ผ ๋‹ซ๊ธฐ

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”?


#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์˜ ๊ธฐ๋ณธ๋ถ€ํ„ฐ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ, ์‹ค์ œ ์‘์šฉ ์‚ฌ๋ก€, ๊ทธ๋ฆฌ๊ณ  ์ฃผ์˜์‚ฌํ•ญ๊นŒ์ง€ ๋ชจ๋‘ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ํŒŒ์ผ ์ž…์ถœ๋ ฅ์˜ ์ง„์ •ํ•œ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ๐Ÿง™โ€โ™‚๏ธโœจ ์ด ์ง€์‹์„ ํ™œ์šฉํ•˜์—ฌ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์šฉํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋”ฉ ์—ฌ์ •์— ํ–‰์šด์ด ํ•จ๊ป˜ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค! ๐Ÿ˜Š