[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
- ํฉ: 550
- ํ๊ท : 55.0
์์ ์ถ๋ ฅ
3) data2.txt
- ๊ฐ์: 9
- ํฉ: 450
- ํ๊ท : 50.0
์์ ์ถ๋ ฅ
์์ฃผ ํ๋ ์ง๋ฌธ & ํ์ฅ ํ
- ์ ์ ์ธ ๋ฌธ์๊ฐ ์์ฌ ์์ผ๋ฉด?
ํ์ฌ ์ฝ๋๋ ์ ์๊ฐ ์๋ ํ ํฐ์ ๋ง๋๋ฉด ๋ฃจํ๊ฐ ๋ฉ์ถ๋ค. ํ์ผ์ ์ฐ๋ ๊ธฐ ๋ฌธ์๊ฐ ์์ผ ์ ์๋ค๋ฉด, fgets๋ก ํ ์ค์ฉ ๋ฐ์ ๋ค strtol์ ๋ฐ๋ณต ํธ์ถํด ํ์ฑํ๋ ๋ฐฉ์์ด ๋ ๊ฒฌ๊ณ ํ๋ค. - ์์ฃผ ํฐ ์ซ์ ์ง์?
long long ๋ฒ์๋ฅผ ๋์ด์ค ์ ์์ผ๋ฉด __int128(GCC ํ์ฅ)์ด๋ ๋์ ํฉ์ long double๋ก ๋ฐ๊ฟ๋ผ. - ํ์ดํ/๋ฆฌ๋๋ ์
์
๋ ฅ๋ ๋ฐ๊ณ ์ถ๋ค๋ฉด?
ํ์ผ ์ธ์๊ฐ -๋ฉด stdin์ ์ฝ๊ฒ ํด ๋ ๋ชจ๋๋ฅผ ์ง์ํ ์ ์๋ค.
'6. CS ๊ธฐ์ด ๐ > Linux & Unix ๐ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Linux/Unix][7-2] date ์ถ๋ ฅ (0) | 2025.10.21 |
|---|---|
| [Linux/Unix][7-1] sysocnf(3) ํจ์ ํ์ฉ (0) | 2025.10.21 |
| [Linux/Unix][6-2] $ ./2 test.txt test.bak (0) | 2025.10.21 |
| [Linux/Unix][6-1] txt write err ์ฒ๋ฆฌ (0) | 2025.10.21 |
| [Linux/Unix][5-2] ํ๋ ๋งํฌ vs ์ฌ๋ณผ๋ฆญ ๋งํฌ (0) | 2025.10.21 |