๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
6. CS ๊ธฐ์ดˆ ๐Ÿ“š/Linux & Unix ๐Ÿง

[Linux/Unix][6-3] ํ•ฉ&ํ‰๊ท  ์ถœ๋ ฅ ํ”„๋กœ๊ทธ๋žจ

by lxvxxu 2025. 10. 21.


[Linux/Unix] 07-1. sysocnf(3) ํ•จ์ˆ˜ ํ™œ์šฉ

 

[Linux/Unix] 07-1. sysocnf(3) ํ•จ์ˆ˜ ํ™œ์šฉ

lxvxxu [Linux/Unix] 07-1. sysocnf(3) ํ•จ์ˆ˜ ํ™œ์šฉ ๋ณธ๋ฌธ

lxvxxu.tistory.com


[Linux/Unix] 07-2. data ์ถœ๋ ฅ

 

[Linux/Unix] 07-2. data ์ถœ๋ ฅ

lxvxxu [Linux/Unix] 07-2. data ์ถœ๋ ฅ ๋ณธ๋ฌธ

lxvxxu.tistory.com

 

 

 

์ž„์˜์˜ ์ •์ˆ˜๊ฐ€ ์žˆ๋Š” data ํŒŒ์ผ์„ command-line argument๋กœ ๋ฐ›์•„ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ฉ๊ณผ ํ‰๊ท ์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ 6-3.c๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ˆ˜ํ–‰

 

 

 

 

์ข‹์•„! ๋ชฉํ‘œ๋Š” ์ •์ˆ˜๋“ค์ด ๋“ค์–ด ์žˆ๋Š” ํŒŒ์ผ ์ด๋ฆ„์„ ์ธ์ž๋กœ ๋ฐ›์•„
count = N sum = S ave = A ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” 6-3.c๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ.
์•„๋ž˜ ์ฝ”๋“œ๋Š” ํ‘œ์ค€ C ํŒŒ์ผ I/O (fopen/fscanf/fclose)๋กœ ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ , ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋„ ๋„ฃ์—ˆ์–ด.


6-3.c (์™„์„ฑ ์ฝ”๋“œ)

// 6-3.c : ํŒŒ์ผ ์† ์ž„์˜์˜ ์ •์ˆ˜๋“ค์„ ๋ชจ๋‘ ์ฝ์–ด ๊ฐœ์ˆ˜/ํ•ฉ/ํ‰๊ท ์„ ์ถœ๋ ฅ
// ์‚ฌ์šฉ๋ฒ•: ./6-3 <data-file>

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <data-file>\n", argv[0]);
        return 1;
    }

    const char *path = argv[1];
    FILE *fp = fopen(path, "r");
    if (!fp) {
        perror("fopen");
        return 1;
    }

    long long sum = 0;     // ํ•ฉ(overflow ์—ฌ์œ ๋ฅผ ์œ„ํ•ด ๋„‰๋„‰ํžˆ)
    long long cnt = 0;     // ๊ฐœ์ˆ˜
    long long x;

    // ๊ณต๋ฐฑ(์ŠคํŽ˜์ด์Šค/ํƒญ/๊ฐœํ–‰)์œผ๋กœ ๊ตฌ๋ถ„๋œ ์ •์ˆ˜๋ฅผ ๋๊นŒ์ง€ ์ฝ๋Š”๋‹ค.
    // fscanf๊ฐ€ ์ •์ˆ˜๋ฅผ ํ•˜๋‚˜ ์„ฑ๊ณต์ ์œผ๋กœ ์ฝ์„ ๋•Œ๋งˆ๋‹ค 1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    while (fscanf(fp, "%lld", &x) == 1) {
        sum += x;
        cnt += 1;
    }

    if (ferror(fp)) {                 // ์ฝ๊ธฐ ์ค‘ ์ž…์ถœ๋ ฅ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ์ฒดํฌ
        perror("read error");
        fclose(fp);
        return 1;
    }
    fclose(fp);

    if (cnt == 0) {                   // ํŒŒ์ผ์— ์ •์ˆ˜๊ฐ€ ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ
        printf("count = 0 sum = 0 ave = 0.000000\n");
        return 0;
    }

    double ave = (double)sum / (double)cnt;
    // ์ถœ๋ ฅ ํ˜•์‹์€ ๋ฌธ์ œ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ๋™์ผํ•˜๊ฒŒ ์†Œ์ˆ˜์  6์ž๋ฆฌ
    printf("count = %lld sum = %lld ave = %.6f\n", cnt, sum, ave);
    return 0;
}

์ปดํŒŒ์ผ

gcc -Wall -Wextra -O2 -o 6-3 6-3.c

์ฝ”๋“œ๊ฐ€ ํ•˜๋Š” ์ผ (์ƒ์„ธ ์„ค๋ช…)

  • ์ธ์ž ๊ฒ€์‚ฌ: ์ธ์ž๊ฐ€ ํ•˜๋‚˜(๋ฐ์ดํ„ฐ ํŒŒ์ผ)์ธ์ง€ ํ™•์ธ. ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉ๋ฒ• ์ถœ๋ ฅ.
  • ํŒŒ์ผ ์—ด๊ธฐ: fopen(path, "r") ๋กœ ์ฝ๊ธฐ ์ „์šฉ ์˜คํ”ˆ. ์‹คํŒจ ์‹œ perror๋กœ ์ด์œ  ์ถœ๋ ฅ.
  • ํŒŒ์‹ฑ ๋ฃจํ”„:
    while (fscanf(fp, "%lld", &x) == 1)
    → ํŒŒ์ผ ๋(EOF)๊นŒ์ง€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ์ •์ˆ˜๋งŒ ์ˆœ์„œ๋Œ€๋กœ ์ฝ์–ด, sum๊ณผ cnt ๊ฐฑ์‹ .
    (๊ณต๋ฐฑ์€ ์ž๋™์œผ๋กœ ์Šคํ‚ต๋˜๋ฉฐ, ์ค„๋ฐ”๊ฟˆ/์ŠคํŽ˜์ด์Šค/ํƒญ ๋ชจ๋‘ OK)
  • ์˜ค๋ฅ˜ ๊ฒ€์ถœ: ferror(fp)๋กœ ์ฝ๊ธฐ ์ค‘ I/O ์˜ค๋ฅ˜ ์—ฌ๋ถ€ ํ™•์ธ.
  • ํ‰๊ท  ๊ณ„์‚ฐ: ์ •์ˆ˜ ๋‚˜๋ˆ—์…ˆ์„ ํ”ผํ•˜๋ ค๊ณ  double๋กœ ์บ์ŠคํŒ… ํ›„ sum/cnt.
  • ์ถœ๋ ฅ ํฌ๋งท: count = … sum = … ave = … ๋ฅผ ์†Œ์ˆ˜์  6์ž๋ฆฌ(%.6f) ๋กœ ์ถœ๋ ฅ.
  • ๋นˆ ํŒŒ์ผ ์ฒ˜๋ฆฌ: ์ •์ˆ˜๊ฐ€ 0๊ฐœ๋ฉด 0 0 0.000000 ์ถœ๋ ฅ.

์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์ธก (์Šคํฌ๋ฆฐ์ƒท์˜ ์„ธ ํŒŒ์ผ)

์Šคํฌ๋ฆฐ์ƒท์— ๋ณด์ด๋Š” ํŒŒ์ผ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ •ํ•˜๋ฉด:

1) data.txt

10 20 30 40 50 60 70 80 90 100
20 30 40 50 60 70 80 90 100
  • ๊ฐœ์ˆ˜: 19
  • ํ•ฉ: 1090
  • ํ‰๊ท : 1090 / 19 = 57.3684210526…

์˜ˆ์ƒ ์ถœ๋ ฅ

count = 19 sum = 1090 ave = 57.368421

2) data1.txt

 
10 20 30 40 50 60 70 80 90 100
  • ๊ฐœ์ˆ˜: 10
  • ํ•ฉ: 550
  • ํ‰๊ท : 55.0

์˜ˆ์ƒ ์ถœ๋ ฅ

 
count = 10 sum = 550 ave = 55.000000

3) data2.txt

 
10 20 30 40 50 60 70 80 90
  • ๊ฐœ์ˆ˜: 9
  • ํ•ฉ: 450
  • ํ‰๊ท : 50.0

์˜ˆ์ƒ ์ถœ๋ ฅ

 
count = 9 sum = 450 ave = 50.000000

์ž์ฃผ ํ•˜๋Š” ์งˆ๋ฌธ & ํ™•์žฅ ํŒ

  • ์ •์ˆ˜ ์™ธ ๋ฌธ์ž๊ฐ€ ์„ž์—ฌ ์žˆ์œผ๋ฉด?
    ํ˜„์žฌ ์ฝ”๋“œ๋Š” ์ •์ˆ˜๊ฐ€ ์•„๋‹Œ ํ† ํฐ์„ ๋งŒ๋‚˜๋ฉด ๋ฃจํ”„๊ฐ€ ๋ฉˆ์ถ˜๋‹ค. ํŒŒ์ผ์— ์“ฐ๋ ˆ๊ธฐ ๋ฌธ์ž๊ฐ€ ์„ž์ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด, fgets๋กœ ํ•œ ์ค„์”ฉ ๋ฐ›์€ ๋’ค strtol์„ ๋ฐ˜๋ณต ํ˜ธ์ถœํ•ด ํŒŒ์‹ฑํ•˜๋Š” ๋ฐฉ์‹์ด ๋” ๊ฒฌ๊ณ ํ•˜๋‹ค.
  • ์•„์ฃผ ํฐ ์ˆซ์ž ์ง€์›?
    long long ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„ค ์ˆ˜ ์žˆ์œผ๋ฉด __int128(GCC ํ™•์žฅ)์ด๋‚˜ ๋ˆ„์  ํ•ฉ์„ long double๋กœ ๋ฐ”๊ฟ”๋ผ.
  • ํŒŒ์ดํ”„/๋ฆฌ๋””๋ ‰์…˜ ์ž…๋ ฅ๋„ ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด?
    ํŒŒ์ผ ์ธ์ž๊ฐ€ -๋ฉด stdin์„ ์ฝ๊ฒŒ ํ•ด ๋‘ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค.