๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
C++ ๊ธฐ์ดˆ

[C++] 13-1. ์ž…์ถœ๋ ฅ(feat. ํ‘œ์ค€์ž…์ถœ๋ ฅ๊ณผ ํŒŒ์ผ์ž…์ถœ๋ ฅ)

by ์„œ์•„๋ž‘๐Ÿ˜ 2023. 5. 17.

 

 

โœ… ์ŠคํŠธ๋ฆผ

์ŠคํŠธ๋ฆผ์€ ํ•˜๋‚˜์˜ ํ๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ์ˆ˜๋„๊ผญ์ง€๋ฅผ ํ‹€์–ด๋†“๊ณ  ๋„ค๋ชจ๋‚œ ํ˜ธ์Šค๋ฅผ ๋ผ์šฐ๋ฉด ๋ฌผ์ด ๋„ค๋ชจ ๋ชจ์–‘์œผ๋กœ ๋‚˜์˜ค๊ณ , ๋™๊ทธ๋ž€ ํ˜ธ์Šค๋ฅผ ๋ผ์šฐ๋ฉด ๋™๊ทธ๋ž—๊ฒŒ ๋‚˜์˜จ๋‹ค. ์šด์˜์ฒด์ œ๊ฐ€ ๋ฌผ์„ ๊ณต๊ธ‰ํ•˜๋Š” ์›์ฒœ์ด๊ณ  ์ŠคํŠธ๋ฆผ์€ ํ˜ธ์Šค๋‹ค. ์ถœ๋ ฅ ๋ฐฉํ–ฅ์„ ํ™”๋ฉด(๋ชจ๋‹ˆํ„ฐ)์œผ๋กœ ์ •ํ•˜๋ฉด ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๊ณ , ํŒŒ์ผ๋กœ ์ •ํ•˜๋ฉด ํŒŒ์ผ์— ์ถœ๋ ฅ(์“ฐ๊ธฐ)๋œ๋‹ค. ์ž…๋ ฅ ๋˜ํ•œ ์ž…๋ ฅ ์žฅ์น˜(ํ‚ค๋ณด๋“œ)๋กœ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํŒŒ์ผ์„ ํ†ตํ•ด ์ฝ์„ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ํŒŒ์ดํ”„(ํŠน์ • ๋ช…๋ น์˜ ๊ฒฐ๊ณผ)๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์œ ๋‹‰์Šค ์šด์˜์ฒด์ œ์™€ ๋ฐ€์ ‘ํ•œ C/C++์€ ์ž…์ถœ๋ ฅ์„ ๋ฐ์ด ์ŠคํŠธ๋ฆผ์œผ๋กœ ํ•ด์„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์ˆ˜์›”ํ•˜๋‹ค.

 

โœ… ํ‘œ์ค€ ์ŠคํŠธ๋ฆผ

ํ‘œ์ค€ ์ŠคํŠธ๋ฆผ์—๋Š” stdin, stdout, stderr ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๊ฐ๊ฐ 0(stdin), 1(stdout), 2(stderr)์˜ fd(File Descriptor, ํŒŒ์ผ์„œ์ˆ ์ž) ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ integer๊ฐ’์˜ ํŒŒ์ผ์„œ์ˆ ์ž๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, ๋งŒ์•ฝ ํŒŒ์ผ ์ž…์ถœ๋ ฅ์ด๋ผ๋ฉด ํŒŒ์ผ ๊ณ ์œ ์˜ ๊ฐ’(ํŒŒ์ผ์„ ์˜คํ”ˆํ•˜๋ฉด ๊ณ ์œ ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜)์„ ํ†ตํ•ด์„œ ํŒŒ์ผ์— ์ ‘๊ทผํ•˜๊ณ , ํ‘œ์ค€ ์ŠคํŠธ๋ฆผ์˜ ๊ฐ’์„ ํ†ตํ•ด์„œ ํ™”๋ฉด์— ์ž…์ถœ๋ ฅ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„ํ‚ค๋ฐฑ๊ณผ์— ๋”ฐ๋ฅด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํ‘œ์ค€ ์ŠคํŠธ๋ฆผ(standard streams)์€ ํŠน์ •ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ธํ„ฐํŽ˜์ด์Šค๋ฟ ์•„๋‹ˆ๋ผ ์œ ๋‹‰์Šค ๋ฐ ์œ ๋‹‰์Šค ๊ณ„์—ด ์šด์˜ ์ฒด์ œ(์–ด๋Š ์ •๋„๊นŒ์ง€๋Š” ์œˆ๋„์šฐ์—๋„ ํ•ด๋‹นํ•จ)์—์„œ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๊ทธ ํ™˜๊ฒฝ(์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ๋ง๊ธฐ) ์‚ฌ์ด์— ๋ฏธ๋ฆฌ ์—ฐ๊ฒฐ๋œ ์ž…์ถœ๋ ฅ ํ†ต๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

 

๋ณดํ†ต ํ‘œ์ค€ ์ŠคํŠธ๋ฆผ์ด๋ผ๊ณ  ํ•˜๋ฉด ํ‚ค๋ณด๋“œ์™€ ๋ชจ๋‹ˆํ„ฐ์˜ ๊ธฐ๋ณธ ์ž…์ถœ๋ ฅ์„ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 

 

โœ… ํŒŒ์ผ ์ž…์ถœ๋ ฅ

#include "stdio.h"

int main()
{
    printf("Hello \n");
    fprintf(stdout, "Hello \n");

    FILE* fp = fopen("abc.txt", "w");
    fprintf(fp, "My name is Seoarang \n");
    fclose(fp);
}

// ์ถœ๋ ฅ ๊ฒฐ๊ณผ
// Hello
// Hello

Unix ์ž…์ถœ๋ ฅ์˜ ์—ญ์‚ฌ๋ฅผ ๋Š๋ผ๊ธฐ(?) ์œ„ํ•ด c ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค.

printf๋Š” ํ‘œ์ค€์ถœ๋ ฅ ์ „์šฉ ํ•จ์ˆ˜์ด๋‹ค. ๋ณ„๋‹ค๋ฅธ ์ธ์ž ์—†์ด ๋ฌธ์ž์—ด๋งŒ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋ฉด ํ™”๋ฉด์— ์ „๋‹ฌ๋œ๋‹ค. ํ‘œ์ค€์ž…๋ ฅ ์ „์šฉ ํ•จ์ˆ˜๋Š” scanf๋‹ค. C++์—์„œ๋Š” cin๊ณผ cout์ด ํ•ด๋‹นํ•œ๋‹ค.

fprintf๋Š” File print์ด๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ํŒŒ์ผ ์„œ์ˆ ์ž๊ฐ€ ์œ„์น˜ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฌธ์ž์—ด์ด ๋“ค์–ด๊ฐ„๋‹ค. ์˜ˆ์ œ์—์„œ, fprintf์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ stdout์„ ๋„ฃ์œผ๋ฉด printf์™€ ๊ฐ™์ด ํ‘œ์ค€์ถœ๋ ฅ์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ fopen์˜ ๊ฒฐ๊ณผ ๊ฐ’์ธ ํŒŒ์ผ ์„œ์ˆ ์ž๋ฅผ ๋„ฃ์œผ๋ฉด ํŒŒ์ผ์— ์“ฐ์—ฌ์ง„๋‹ค. abc.txt์—๋Š” "My name is Seoarang"์ด ์“ฐ์—ฌ์ง„๋‹ค.

๋ฐ˜๋Œ€๋กœ ํŒŒ์ผ ์ž…๋ ฅ์€ fscanf์ด๋‹ค.

 

 

์ด์ฒ˜๋Ÿผ ํŒŒ์ผ ์ž…์ถœ๋ ฅ๊ณผ ๊ด€๋ จ๋œ ์‹œ์Šคํ…œ ํ•จ์ˆ˜๋Š” fget, fput, fread, fwrite, fscanf, fprintf์ด ์žˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ ์กฐ๊ธˆ์”ฉ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ ๋ชจ๋‘ ํŒŒ์ผ ์ž…์ถœ๋ ฅ์„ ์ง€์›ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.

#include <stdio.h>  // C++ ์˜ ๊ฒฝ์šฐ <cstdio>


int fgetc(FILE* stream);	// ํ•œ๊ธ€์ž ์ถœ๋ ฅ
int fputc(int character, FILE* stream);	// ํ•œ๊ธ€์ž ์ž…๋ ฅ
char* fgets(char* str, int num, FILE* stream);	// ๋ฌธ์ž์—ด ์ถœ๋ ฅ
int fputs(const char* str, FILE* stream);	// ๋ฌธ์ž์—ด ์ž…๋ ฅ
size_t fread(void* ptr, size_t size, size_t count, FILE* stream);	// ๋ฒ„ํผ ๋งŒํผ ๋ฌธ์ž์—ด ์ถœ๋ ฅ
size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream);	// ๋ฒ„ํผ ๋งŒํผ ๋ฌธ์ž์—ด ์ž…๋ ฅ
int fprintf(FILE *stream, const char *format, ...);	// ํฌ๋งท ๋ฌธ์ž์—ด ์ถœ๋ ฅ
int fscanf(FILE *stream, cont char *format, ...);	// ํฌ๋งท ๋ฌธ์ž์—ด ์ž…๋ ฅ

 

๐ŸงจํŒŒ์ผ ์—ด๊ธฐ ์˜ต์…˜๊ณผ ํŒŒ์ผ ์ž…์ถœ๋ ฅ ํ™œ์šฉ ์˜ˆ์ œ

fopen์‹œ ํŒŒ์ผ ์—ด๊ธฐ ์˜ต์…˜์—๋Š” "r+", "w+", "a", "a+" ์™€ ๊ฐ™์ด ์ฝ๊ธฐ/์“ฐ๊ธฐ/์ฝ๊ธฐ์“ฐ๊ธฐ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชจ๋“œ๊ฐ€ ์žˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•ด๋ณด์ž.

์ถœ์ฒ˜:&nbsp;https://velog.io/@coding_wizard/PHP%ED%8C%8C%EC%9D%BC%EC%8B%9C%EC%8A%A4%ED%85%9Cfile-system

fopen ํ›„์—๋Š” fclose๋ฅผ ๋ฐ˜๋“œ์‹œ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ํŒŒ์ผ ์„œ์ˆ ์ž๋ฅผ ์ ์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ UI์—์„œ๋„ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด์ž.

#include "stdio.h"
#include "unistd.h"

...

bool constructSymbolMap(const std::string& path)
{
    char str[2048];
    memset(str, 0, sizeof(str));
        
    FILE *fd = fopen((path + "/" + STR_SYMBOL_MARKET_CSV).c_str(), "r");
    if (fd > 0)
    {
        symbolMarketMap.clear();
        while (fgets(str, 2048, fd))
        {
            char *line = str;
            char *pch = strsep(&line, ",");
            if (*pch == '\0')
            {
                printSeperateError(counter, idx++);
                continue;
            }
            symbol_id = atoi(pch);

            pch = strsep(&line, ",");
            if (*pch == '\0')
            {
                printSeperateError(counter, idx++);
                continue;
            }
            strncpy(exchange_name, pch, 32);
        }
    }
    else
    {
        printf("Cannot read %s file", path.c_str());
        return false;
    }
    
    return true;
}

ํŒŒ์ผ์„ fopen์„ ํ†ตํ•ด ์—ด๊ณ , fgets๋กœ ํ•œ์ค„์”ฉ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ฐ˜๋ณตํ•ด์„œ ๊ฐ€์ ธ์˜จ๋‹ค. ๊ฐ€์ ธ์˜จ ๋‚ด์šฉ์„ strsep์ด๋ผ๋Š” ๋ฌธ์ž์—ด ๊ตฌ๋ถ„์ž(",")๋กœ ์ž๋ฅด๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜๊ณ  ์žˆ๋‹ค. ์ฆ‰, csv(comma seperate value) ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค. 

 

์ด์ฒ˜๋Ÿผ ์ •ํ˜•ํ™” ๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ์„ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ฝ์–ด์„œ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์€๊ทผ ๋งŽ๋‹ค. ํŒŒ์ผ์— ์“ฐ๋Š” ๊ฒฝ์šฐ๋„ ๊ฐ€๋” ์žˆ์ง€๋งŒ ์ฝ์–ด์„œ ์˜๋ฏธ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ›จ์”ฌ ๋” ๋งŽ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ ํŒŒ์ผ ์ž…์ถœ๋ ฅ๊ณผ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์—ฐ์Šตํ•ด๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๊ตณ์ด C++์ด ์•„๋‹ˆ๋”๋ผ๋„ ์ž๋ฐ”๋‚˜ ํŒŒ์ด์ฌ์œผ๋กœ๋„ ํ•œ ๋ฒˆ์ฏค์€ ์—ฐ์Šตํ•ด๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค.

 

C++์˜ fstream, ifstream, ofstream์˜ ์ŠคํŠธ๋ฆผ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ๊ฐ•์˜์—์„œ ์‚ดํŽด๋ณด๊ฒ ๋‹ค.

๋Œ“๊ธ€