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 구현
2021.04.22 - [C & linux] - basename 이름만 보이는 함수
2021.04.20 - [C & linux] - errno.h 변수를 이용한 오류처리
#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);
}