42 Seoul

[42Seoul] cat 구현하기

jaewpark 2021. 4. 22. 18:15

cat

파일 및 표준 입력의 대용을 그대로 표준 출력에 출력하는 명령어

cat 1.txt

위와 같이 사용하면 파일을 읽어와서 출력하게 된다.

cat > 2.txt

위와 같이 사용하게 되면 하단에 입력을 할 수 있게되며, (ctrl + d) 를 눌러서 입력을 종료하면 2.txt 파일에 입력받은 내용이 저장된다.

cat >> 2.txt

위와 비슷하나 다른 점은 문자열 맨 뒤에 붙여넣기 하는 방식이다. 하단에 입력을 하고 나면 기존에 있던 내용 뒤에 새로운 문자열을 붙여넣게 된다.

 

알아야 하는 문자열 함수

strcat : 기존 문자열 뒤에 붙여넣기 새로운 문자열을 붙여넣기

strcpy  : 기존 문자열을 지우고 새로운 문자열로 복사하기

 

아래에서 open() 함수에서 사용되는 O_CREAT 는 파일 생성, O_TRUC 은 기존 파일 내용을 모두 삭제, O_APPEND 파일을 추가하여 쓰기가 되도록 open 후에 쓰기 포인터가 제일 끝에 위치하게 된다.

 

2021.04.19 - [C & linux] - c언어 open, read, write 구현

 

c언어 open, read, write 구현

OPEN(2) #include int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); : open()함수는 int 형 정수를 반환하며, 음수의 숫자가 반환될 경우에는 파일 열기에..

raidho.tistory.com

2021.04.22 - [C & linux] - basename 이름만 보이는 함수

 

basename 이름만 보이는 함수

#include char *basename(char *path); : path가 파일 정보로 파일명만 얻을 수 있는 함수 cat 함수를 구현하기 위해, 사용을 하기 위한 함수 사용 이유는 파일 오류를 출력할 때 보면, cat 파일 이름만 표시가

raidho.tistory.com

2021.04.20 - [C & linux] - errno.h 변수를 이용한 오류처리

 

errno.h 변수를 이용한 오류처리

: errno.h 헤더 파일에 정의도니 전역 변수 errno 를 사용하여 오류에 대한 이유를 알기 위해서 사용된다. errno 변수는 다른 함수를 실행하면 값이 변경, 여러 번 호출할 경우에는 값을 유지시키기 위

raidho.tistory.com

 

#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <libgen.h>

#define BUF_SIZE 1

char *g_name;

void ft_putstr(char *str)
{
        while (*str)
                write(1, str++, 1);
}

void print_error(char *file)
{
        ft_putstr(basename(g_name));
        ft_putstr(": ");
        ft_putstr(file);
        ft_putstr(": ");
        ft_putstr(strerror(errno));
        ft_putstr("\n");
        errno = 0;
}

char *ft_strcpy(char *str1, char *str2)
{
        int i;

        i = 0;
        while (str2[i])
        {
                str1[i] = str2[i];
                i++;
        }
        str1[i] = 0;
        return (str1);
}

char *ft_strcat(char *str1, char *str2)
{
        char *ptr;

        ptr = str1;
      //while (*ptr)
      //	++ptr;
        while (*str2)
        {
                *ptr = *str2;
                ++str2;
                ++ptr;
        }
        *ptr = 0;
        return (str1);
}

void write_file(int fd, char *file, int number)
{
        long size;
        unsigned char buf[BUF_SIZE];

        while (size = read(fd, buf, BUF_SIZE))
        {
                if (errno)
                {
                        print_error(file);
                        return ;
                }
                if (number == 1)
                        strcpy(file, buf);
                else if (number == 2)
                        strcat(file, buf);
        }
}

void display_file(int fd, char *file)
{
        long size;
        unsigned char buf[BUF_SIZE];

        while (size = read(fd, buf, BUF_SIZE))
        {
                if (errno)
                {
                        print_error(file);
                        return ;
                }
                write(1, buf, size);
        }
}

int main(int ac, char *av[])
{
        int fd;
        int i;
        g_name = av[0];
        if (ac == 1)
                display_file(0, 0);
        else
        {
                i = 0;
                while (++i < ac)
                {
                        if (av[1] == ">")
                        {
                                fd = open(av[2], O_CREAT | O_WRONLY | O_TRUNC, 0644);
                                write_file(fd, av[2], 1);
                        }
                        else if (av[1] == ">>")
                        {
                                fd = open(av[2], O_CREAT | O_WRONLY | O_APPEND, 0644);
                                write_file(fd, av[2], 2);
                        }
                        else
                        {
                                if ((fd = open(av[i], O_RDONLY)) == -1)
                                {
                                        print_error(av[i]);
                                        continue ;
                                }
                        display_file(fd, av[i]);
                        close(fd);
                        }
                }
        }
        return (0);
}