😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[파일 μ²˜λ¦¬μ™€ ν‘œμ€€μž…μΆœλ ₯] 파일 λ””μŠ€ν¬λ¦½ν„°λ‘œ open & read & write λ³Έλ¬Έ

πŸ‘©‍πŸ’» IoT (Embedded)/Raspberry Pi

[파일 μ²˜λ¦¬μ™€ ν‘œμ€€μž…μΆœλ ₯] 파일 λ””μŠ€ν¬λ¦½ν„°λ‘œ open & read & write

μ§•μ§•μ•ŒνŒŒμΉ΄ 2024. 1. 2. 20:29
728x90
λ°˜μ‘ν˜•

<μ„œμ˜μ§„ λ‹˜μ˜ 사물인터넷을 μœ„ν•œ λ¦¬λˆ…μŠ€ ν”„λ‘œκ·Έλž˜λ° with λΌμ¦ˆλ² λ¦¬νŒŒμ΄ μ„œμ μ„ μ°Έκ³ ν•΄μ„œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€ :-)>

 

⭐ 파일 μ²˜λ¦¬μ™€ ν‘œμ€€ μž…μΆœλ ₯

// ν•˜λ‚˜μ˜ 파일의 λ‚΄μš©μ„ λ‹€μŒ 파일둜 λ³΅μ‚¬ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄μž
// 2개의 파일λͺ…을 μž…λ ₯λ°›κ³  2개의 νŒŒμΌμ„ μ—΄κ±°λ‚˜ μƒμ„±ν•œ ν›„ 첫 번째 νŒŒμΌμ—μ„œ 데이터 μ½μ–΄μ„œ 두 번째 파일둜 μ“΄λ‹€
#include <unistd.h>     // μœ λ‹‰μŠ€ ν‘œμ€€ μ‹œμŠ€ν…œ 콜
#include <fcntl.h>
#include <stdio.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc, char **argv) {
    int n, in, out;
    char buf[1024];

    // λͺ…λ Ήν˜• 인수둜 볡사할 파일λͺ…이 μ—†λŠ” κ²½μš°μ— μ—λŸ¬ 좜λ ₯ν•˜κ³  μ’…λ£Œ
    if (argc < 3) {
        // write() : μ—΄λ¦° 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ΄μš©ν•΄μ„œ νŒŒμΌμ— 데이터λ₯Ό μ“°λ©°, 데이터λ₯Ό μ“΄ 만큼 파일 λ‚΄μ˜ μ˜€ν”„μ…‹ 증가
        // λ°μ΄ν„°μ˜ 바이터 수 λ°˜ν™˜ 0 & μ‹€νŒ¨ν•˜λ©΄ -1
        // (int fd: 파일 λ””μŠ€ν¬λ¦½ν„°, const void *buf: μ“Έ 데이터가 μžˆλŠ” λ²„νΌμ˜ ν¬μΈν„°ν˜• λ³€μˆ˜, size_t cnt: μ΅œλŒ€ λ°”μ΄νŠΈ 수)
        write(2, "Usage : copy file1 file2\n", 25);
        return -1;
    }

    // λ³΅μ‚¬μ˜ 원본이 λ˜λŠ” νŒŒμΌμ„ 읽기 λͺ¨λ“œλ‘œ μ—°λ‹€
    // open() : νŒŒμΌμ„ μ‘°μž‘ν•˜κΈ° μœ„ν•΄ ν•΄λ‹Ή 파일 μ—΄κΈ°
    // (const char *path: μ—΄ 파일의 경둜 지정, int flags: νŒŒμΌμ„ μ—΄ λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” ν”Œλž˜κ·Έ, mode_t mode *: 파일 μƒμ„±μ‹œ μ ‘κ·Ό κΆŒν•œ)
    // O_RDONLY 읽기 O_WRONLY μ“°κΈ° O_RDWR 읽기/μ“°κΈ°
    if ((in = open(argv[1], O_RDONLY)) < 0) {
        // 1) copy.c open ν•΄μ„œ read ν•©λ‹ˆλ‹€.
        perror(argv[1]);
        return -1;
    }

    // 볡사할 κ²°κ³Ό νŒŒμΌμ„ μ“°κΈ° λͺ¨λ“œ(μƒˆλ‘œμš΄ 파일 생성 | κΈ°μ‘΄ 파일 λ‚΄μš© 지움)둜 μ—°λ‹€
    if ((out = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR)) < 0) {
        // 1) copy1.c open ν•΄μ„œ write ν•©λ‹ˆλ‹€.
        perror(argv[2]);
        return -1;
    }

    // 원본 파일의 λ‚΄μš©μ„ μ½μ–΄μ„œ 볡사할 νŒŒμΌμ— μ“΄λ‹€
    // read() : μ—΄λ¦° 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ΄μš©ν•΄μ„œ νŒŒμΌλ‘œλΆ€ν„° 데이터 μ½μ–΄λ“€μž„ (데이터 읽은 만큼 파일 λ‚΄μ˜ μ˜€ν”„μ…‹ 증가) & λ²„νΌλ‘œ 읽어듀인 λ°μ΄ν„°μ˜ λ°”μ΄νŠΈ 수 λ°˜ν™˜
    // λ°μ΄ν„°μ˜ 바이터 수 λ°˜ν™˜ & 파일의 끝 λ§Œλ‚˜λ©΄ 0 & μ‹€νŒ¨ν•˜λ©΄ -1
    // (inf fd: 읽고 싢은 파일 λ””μŠ€ν¬λ¦½ν„°, void *buf: 읽어 듀인 데이터λ₯Ό μ €μž₯ν•˜λŠ” λ²„νΌμ˜ ν¬μΈν„°ν˜• λ³€μˆ˜, size_t cnt: μ΅œλŒ€ λ°”μ΄νŠΈ 수)
    while ((n = read(in, buf, sizeof(buf))) > 0) {
        write(out, buf, n);
    }
    // => in 으둜 read()λ₯Ό μ΄μš©ν•΄ 데이터λ₯Ό 읽고 out 으둜 write()λ₯Ό μ΄μš©ν•΄ 읽은 데이터λ₯Ό μ“΄λ‹€

    // μ—΄λ¦° νŒŒμΌλ“€ λ‹«λŠ”λ‹€
    // close() : μ—΄λ¦° νŒŒμΌμ„ λ‹«κΈ° & 파일 λ‹«κΈ° μ„±κ³΅ν•˜λ©΄ 0 μ‹€νŒ¨ν•˜λ©΄ -1
    // (int fd: ν˜„μž¬ μ—΄λ € μžˆλŠ” 파일 λ””μŠ€ν¬λ¦½ν„°)
    close(out);
    close(in);

    // ν”„λ‘œκ·Έλž¨μ˜ 정상 μ’…λ£Œ μ‹œ 0을 λ°˜ν™˜
    return 0;
}

/*
gani@gani:~/raspi/File $ gcc -o copy copy.c
gani@gani:~/raspi/File $ ./copy copy.c copy1.c
gani@gani:~/raspi/File $ ls -al copy*.c
-rw-r--r-- 1 gani gani 2774  1μ›”  2일  20:22 copy.c
-rw------- 1 gani gani 2774  1μ›”  2일  20:23 copy1.c

copy1.c 에 copy.c λ³΅μ‚¬λœ 파일이 μƒμ„±λ˜μ–΄ μžˆλ‹€
*/
gcc -o copy copy.c
./copy copy.c copy1.c
ls -al copy*.c

728x90
λ°˜μ‘ν˜•
Comments