Guest User

Untitled

a guest
Nov 21st, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.46 KB | None | 0 0
  1. //------------------------------------------------------------------------
  2. // NAME: Daniel Rusinov
  3. // CLASS: XIb
  4. // NUMBER: 06
  5. // FILE NAME: tail.c
  6. // FILE PURPOSE:
  7. // Целта на задачате е да се реализира командата tail, която се използва за показване на последните редове на файлове. От
  8. // командния ред програмата получава списък от файлове и започва да ги обработва като последните 10 реда от всеки файл
  9. // последователно се копират в стандартния изход.
  10. //------------------------------------------------------------------------
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <unistd.h>
  15. #include <sys/types.h>
  16. #include <sys/stat.h>
  17. #include <fcntl.h>
  18. #include <string.h>
  19.  
  20. #define SIZE 100000
  21.  
  22. int main(int argc, char **argv){
  23.  
  24. char str1[4] = {"==> "};
  25. char str2[5] = {" <==\n"};
  26.  
  27. for(int i = 1; i < argc; i++){
  28.  
  29. int count = 0;
  30. ssize_t read_bytes = 0, written_bytes = 0;
  31. char buffer;
  32.  
  33. int fd = open(argv[i], O_RDONLY);
  34. if(fd < 0){
  35. write(STDOUT_FILENO, "tail: cannot open '", 20);
  36. write(STDOUT_FILENO, argv[i], strlen(argv[i]));
  37. write(STDOUT_FILENO, "' for reading: ", 15);
  38. perror("");
  39. continue;
  40. }
  41.  
  42. if(argc == 1){
  43.  
  44. char string[SIZE];
  45. int j = 0;
  46.  
  47. while(read_bytes = read(STDIN_FILENO, &buffer, 1) != 0){
  48. if(read_bytes < 0){
  49. write(STDOUT_FILENO, "tail: error reading '", 21);
  50. write(STDOUT_FILENO, argv[i], strlen(argv[i]));
  51. write(STDOUT_FILENO, "': ", 3);
  52. perror("");
  53. return 6;
  54. } else if(read_bytes == 0){ break; }
  55.  
  56. string[j] = buffer;
  57. j++;
  58. }
  59.  
  60. for(int temp = j ;temp >= 0; temp--){
  61. if(string[temp] == '\n'){
  62. if(count == 10){ break; }
  63. count++;
  64. }
  65.  
  66. written_bytes = write(STDOUT_FILENO, string + temp, 1);
  67. if(written_bytes < 0){ break; }
  68.  
  69. }
  70.  
  71. }
  72.  
  73. if(argc > 2){
  74. write(STDOUT_FILENO, str1, 4);
  75. write(STDOUT_FILENO, argv[i], strlen(argv[i]));
  76. write(STDOUT_FILENO, str2, 5);
  77. }
  78.  
  79. off_t size = lseek(fd, -1, SEEK_END);
  80. // if(size < 0){
  81. // perror("size");
  82. // return 4;
  83. // }
  84.  
  85. while(1){
  86.  
  87. read_bytes = read(fd, &buffer, 1);
  88. if(read_bytes < 0){
  89. write(STDOUT_FILENO, "tail: error reading '", 21);
  90. write(STDOUT_FILENO, argv[i], strlen(argv[i]));
  91. write(STDOUT_FILENO, "': ", 3);
  92. perror("");
  93. return 5;
  94. } else if(read_bytes == 0){ break; }
  95.  
  96. if(buffer == '\n'){
  97. if(count == 10){ break; }
  98. count++;
  99. }
  100.  
  101. size = lseek(fd, -2, SEEK_CUR);
  102.  
  103. }
  104.  
  105. while(1){
  106. read_bytes = read(fd, &buffer, 1);
  107. if(read_bytes < 0){
  108. write(STDOUT_FILENO, "tail: error reading '", 21);
  109. write(STDOUT_FILENO, argv[i], strlen(argv[i]));
  110. write(STDOUT_FILENO, "': ", 3);
  111. perror("");
  112. return 6;
  113. } else if(read_bytes == 0){ break; }
  114.  
  115. written_bytes = write(STDOUT_FILENO, &buffer, 1);
  116. if(written_bytes < 0){
  117. perror("tail: error writing 'standard output'");
  118. return 7;
  119. }
  120.  
  121. }
  122.  
  123. if(i != argc - 1){
  124. write(STDOUT_FILENO, "\n", 1);
  125. }
  126.  
  127. if(close(fd) < 0){
  128. write(STDOUT_FILENO, "tail: error reading '", 21);
  129. write(STDOUT_FILENO, argv[i], strlen(argv[i]));
  130. write(STDOUT_FILENO, "': ", 3);
  131. perror("close");
  132. return 2;
  133. }
  134. }
  135.  
  136. return 0;
  137. }
Add Comment
Please, Sign In to add comment