Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //------------------------------------------------------------------------
- // NAME: Daniel Rusinov
- // CLASS: XIb
- // NUMBER: 06
- // FILE NAME: tail.c
- // FILE PURPOSE:
- // Целта на задачате е да се реализира командата tail, която се използва за показване на последните редове на файлове. От
- // командния ред програмата получава списък от файлове и започва да ги обработва като последните 10 реда от всеки файл
- // последователно се копират в стандартния изход.
- //------------------------------------------------------------------------
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <string.h>
- #define SIZE 100000
- int main(int argc, char **argv){
- char str1[4] = {"==> "};
- char str2[5] = {" <==\n"};
- for(int i = 1; i < argc; i++){
- int count = 0;
- ssize_t read_bytes = 0, written_bytes = 0;
- char buffer;
- int fd = open(argv[i], O_RDONLY);
- if(fd < 0){
- write(STDOUT_FILENO, "tail: cannot open '", 20);
- write(STDOUT_FILENO, argv[i], strlen(argv[i]));
- write(STDOUT_FILENO, "' for reading: ", 15);
- perror("");
- continue;
- }
- if(argc == 1){
- char string[SIZE];
- int j = 0;
- while(read_bytes = read(STDIN_FILENO, &buffer, 1) != 0){
- if(read_bytes < 0){
- write(STDOUT_FILENO, "tail: error reading '", 21);
- write(STDOUT_FILENO, argv[i], strlen(argv[i]));
- write(STDOUT_FILENO, "': ", 3);
- perror("");
- return 6;
- } else if(read_bytes == 0){ break; }
- string[j] = buffer;
- j++;
- }
- for(int temp = j ;temp >= 0; temp--){
- if(string[temp] == '\n'){
- if(count == 10){ break; }
- count++;
- }
- written_bytes = write(STDOUT_FILENO, string + temp, 1);
- if(written_bytes < 0){ break; }
- }
- }
- if(argc > 2){
- write(STDOUT_FILENO, str1, 4);
- write(STDOUT_FILENO, argv[i], strlen(argv[i]));
- write(STDOUT_FILENO, str2, 5);
- }
- off_t size = lseek(fd, -1, SEEK_END);
- // if(size < 0){
- // perror("size");
- // return 4;
- // }
- while(1){
- read_bytes = read(fd, &buffer, 1);
- if(read_bytes < 0){
- write(STDOUT_FILENO, "tail: error reading '", 21);
- write(STDOUT_FILENO, argv[i], strlen(argv[i]));
- write(STDOUT_FILENO, "': ", 3);
- perror("");
- return 5;
- } else if(read_bytes == 0){ break; }
- if(buffer == '\n'){
- if(count == 10){ break; }
- count++;
- }
- size = lseek(fd, -2, SEEK_CUR);
- }
- while(1){
- read_bytes = read(fd, &buffer, 1);
- if(read_bytes < 0){
- write(STDOUT_FILENO, "tail: error reading '", 21);
- write(STDOUT_FILENO, argv[i], strlen(argv[i]));
- write(STDOUT_FILENO, "': ", 3);
- perror("");
- return 6;
- } else if(read_bytes == 0){ break; }
- written_bytes = write(STDOUT_FILENO, &buffer, 1);
- if(written_bytes < 0){
- perror("tail: error writing 'standard output'");
- return 7;
- }
- }
- if(i != argc - 1){
- write(STDOUT_FILENO, "\n", 1);
- }
- if(close(fd) < 0){
- write(STDOUT_FILENO, "tail: error reading '", 21);
- write(STDOUT_FILENO, argv[i], strlen(argv[i]));
- write(STDOUT_FILENO, "': ", 3);
- perror("close");
- return 2;
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment