cat 명령어 구현하기
글쓴이: 익명 사용자 / 작성시간: 금, 2021/04/02 - 12:23오후
open(), close(), read(), write() 들을 활용해서
cat 명령어를 구현하고 이때 cat > 는 ovewrite기능이 되게, cat >>는 append 기능이 되게 구현해야 하는데요,
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include<fcntl.h>
#define FILE_SIZE 1024
int main(int argc, char * argv[]){
int fd;
char * readData = (char *)malloc(sizeof(char) * FILE_SIZE);
char * writeData = (char *)malloc(sizeof(char) * FILE_SIZE);
if(argc == 2) // (simple) file print
{
if( ( fd = open(argv[1], O_RDONLY)) < 0){ // not exists files
printf("File not exists\n");
exit(1);
}
read(fd, readData, FILE_SIZE);
printf("%s print\n", argv[1]);
printf("%s\n", readData);
close(fd);
free(readData);
}
else if(argc > 2) // parameteres exist(append OR overwrite)
{
if(strcmp(argv[1], ">") == 0) // overwrite.
fd = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0644);
else if(strcmp(argv[1], ">>") == 0) // append.
fd = open(argv[2], O_CREAT | O_WRONLY | O_APPEND, 0644);
else
{
printf("%s don`t parameters\n", argv[1]);
exit(1);
}
scanf("%s", writeData);
write(fd, writeData, strlen(writeData));
close(fd);
free(writeData);
}
return 0;
}
이런식으로 했을때, file이 print도 되고, 없는 file이면 없는 file이라고 알려주는 기능까지는 됬는데
이후에 overwrite와 append 기능에서 출력이 되질 않습니다
예를들어
./a.out ">" test.txt 를 쳐서
Create File! 이라는 내용을 입력해서 test.txt를 생성했습니다
그 이후에
./a.out test.txt 를 치면
입력했던 Create File! 이 나와야되는데 안나오는데 뭐가문제일까요.??Forums:

나오는데요
나오는데요
여기저기 심각한 문제가 많은 코드입니다만 (특히
printf("%s\n", readData);부분, readData는 NUL-terminated 되었다는 보장이 없습니다!) 어쨌든 출력을 하긴 합니다.엄.. 저는 왜 안나올까요..ㅜ
엄.. 저는 왜 안나올까요..ㅜ
배운지 얼마안된 초심자라 부족한점이 많았나보네요..
십중팔구
십중팔구
1. 입력 문자열에 띄어쓰기가 있어서 scanf가 끊기면서 "Create" 까지만 읽고 씀
2. 파일을 읽어들일 때 NUL-terminate되지 않은 "Create"를 출력하려다가, buffer가 flush되지 않은 상태로 프로그램이 비정상 종료
뭐 아마 이런 상황일 겁니다. 해결 방법은 뭐...
1. scanf로 입력 받지 말고 다른 거 쓰세요. buffered I/O를 꼭 쓰고 싶다면 차라리 fread 추천.
2. 출력할 때도 마찬가지. NUL-terminated 되지 않은 문자 배열은 printf로 출력하면 안됩니다. 차라리 fwrite를 쓰세요.
이거 외에도 이것저것 문제가 많지만 엄청 치명적이진 않으니 대충 생략.
컴파일은 되는데 실행하면 원하는 결과 안 나올 때는
컴파일은 되는데 실행하면 원하는 결과 안 나올 때는
컴파일 할 때 Error 뿐 아니라 Warning 메시지도 잘 살펴보면 도움될 때가 많아요.
세벌 https://sebuls.blogspot.kr/
댓글 달기