Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //------------------------------------------------------------------------
- // NAME: Маргарита Маринова
- // CLASS: XIa
- // NUMBER: 14
- // PROBLEM: #1
- // FILE NAME: tail.c
- // FILE PURPOSE:
- // Да се реализира стандартаната UNIX команда tail
- //------------------------------------------------------------------------
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <errno.h>
- //------------------------------------
- // FUNCTUION: void my_write(char line[])
- // Параметри char line[] - подаваме текста, който искаме да изпишем на стандартния изход.
- //--------------------------------------
- void my_write(char line[])
- {
- write(STDOUT_FILENO, line, strlen(line));
- }
- //------------------------------------
- // FUNCTUION: void my_еrr_write(char line[])
- // Параметри char line[] - подаваме текста, който искаме да изпишем на стандартния изход за грешки.
- //--------------------------------------
- void my_err_write(char line[])
- {
- write(STDERR_FILENO, line, strlen(line));
- }
- int open_err(int i,int check,int argc,char* filename,char* str){
- int count=0;
- char buff[100];
- if(i==2 && check==1)my_write("\n");
- for(count=0;count<=strlen(filename);count++){
- str[count]=(filename)[count];
- }
- sprintf(buff,"tail: cannot open '%s' for reading: %s",str,strerror(errno));
- write(STDERR_FILENO, buff,strlen(buff));
- if(i>1 || argc==2)my_write("\n");
- return 1;
- }
- int read_err(int i,int check,int argc,char* filename,char* str){
- int count=0;
- char buff[100];
- if(i==2 && check==1)my_write("\n");
- for(count=0;count<=strlen(filename);count++){
- str[count]=(filename)[count];
- }
- sprintf(buff,"tail: error reading '%s': %s",str,strerror(errno));
- write(STDERR_FILENO, buff,strlen(buff));
- if(i>1 || argc==1)my_write("\n");
- return 1;
- }
- int write_err(int i,int check,int argc,int is_it_file){
- char buff[100];
- if(i==2 && check==1)my_write("\n");
- if(is_it_file==1){
- sprintf(buff,"tail: error writing: %s",strerror(errno));
- }else{
- sprintf(buff,"tail: error writing 'standard output': %s",strerror(errno));
- }
- write(STDERR_FILENO, buff,strlen(buff));
- if(i>1 || argc==1)my_write("\n");
- return 1;
- }
- int close_err(int i,int check,int argc,char* filename,char* str){
- int count=0;
- char buff[100];
- if(i==2 && check==1)my_write("\n");
- for(count=0;count<=strlen(filename);count++){
- str[count]=(filename)[count];
- }
- sprintf(buff,"tail: error reading '%s': %s",str,strerror(errno));
- write(STDERR_FILENO, buff,strlen(buff));
- if(i>1 || argc==1)my_write("\n");
- return 1;
- }
- int tail_for_file(int i,int check,int numb_files,char*filename){
- int fd;// използва се за достъп до даден файл
- int error_exist=0,its_file=1;
- int lines=0,count=0;//броячи
- ssize_t wresult=0;// съхранява се стойносста върната от write()
- ssize_t cresult=0;// съхранява се стойносста върната от close()
- ssize_t rresult = 0;// съхранява се стойносста върната от read()
- ssize_t whole = 0;// Общата стойност на прочетените байтовете.
- ssize_t pos;// брои байтовете
- char buff[100],str[100];// buff - съхранява прочетените байтове.
- fd = open(filename, O_RDONLY);
- if(fd < 0){ //възникнала е грешка
- check=open_err(i,check,numb_files,filename,str);
- error_exist=1;
- }
- whole=lseek(fd,0,SEEK_END);// lseek мести позицията ни във файла, в случая до края на файла
- pos=0;
- lines=0;
- while(pos<=whole){
- pos=lseek(fd,--whole,SEEK_SET);//отброяваме наобратно
- rresult=read(fd,buff,1);
- if(rresult < 0 && error_exist == 0){
- check=read_err(i,check,numb_files,filename,str);
- error_exist=1;
- }
- if(*buff=='\n'){
- lines++;
- }
- if(lines>=11)break;
- }if(lines>=11){
- lseek(fd,pos+1,SEEK_SET);
- }else lseek(fd,0,SEEK_SET); // ако файла има по-малко от 10 реда се изкарва цялатa
- if(numb_files>2 && error_exist==0){
- if(i>1)my_write("\n");
- for(count=0;count<=strlen(filename);count++){
- str[count]=(filename)[count];
- }
- my_write("==> ");
- my_write(str);
- my_write(" <==\n");
- }
- while((rresult = read(fd, buff, 1)) > 0){
- if(rresult < 0 && error_exist == 0){
- check=read_err(i,check,numb_files,filename,str);
- error_exist=1;
- }
- wresult=write(STDOUT_FILENO, buff, rresult); //изкарва файла от позицията на която се намираме
- if(wresult < 0 && error_exist == 0){
- check=write_err(i,check,numb_files,its_file);
- error_exist=1;
- }
- }
- cresult=close(fd);// затваря достъпващия файл
- if(cresult < 0 && error_exist == 0){
- check=close_err(i,check,numb_files,filename,str);
- error_exist=1;
- }
- return check;
- }
- void *tail_for_standard(int i,int check, int numb_files){
- int error_exist=0,its_file=0;
- ssize_t wresult=0;// съхранява се стойносста върната от write()
- ssize_t cresult=0;// съхранява се стойносста върната от close()
- ssize_t rresult = 0;// съхранява се стойносста върната от read()
- char buff[100],str[100],buf;// buff - съхранява прочетените байтове.
- char *filename="tmp_file.txt";
- int fd=open("tmp_file.txt",O_CREAT|O_WRONLY,S_IRWXU);
- while(rresult=read(STDIN_FILENO,&buf,1)>0){
- if(rresult < 0 && error_exist == 0){
- check=read_err(i,check,numb_files,filename,str);
- error_exist=1;
- }
- wresult=write(fd,&buf,1);
- if(wresult < 0 && error_exist == 0){
- check=write_err(i,check,numb_files,its_file);
- error_exist=1;
- }
- }
- cresult=close(fd);// затваря достъпващия файл
- if(cresult < 0 && error_exist == 0){
- check=close_err(i,check,numb_files,filename,str);
- error_exist=1;
- }
- if(numb_files>2 && error_exist==0){
- if(i>1)my_write("\n");
- my_write("==>");
- my_write(" standard input ");
- my_write("<==\n");
- }
- tail_for_file(i,check,numb_files,filename);
- }
- int main (int argc, char* argv[]){ // argc съдържа броя на аргументите, argv съдържа самите аргументи
- int count=0,i=1;//броячи
- int check=0;
- if(argc==1)tail_for_standard(i,check,argc); //
- for(i=1;i<=argc-1;i++){
- if(*argv[i] == '-'){
- tail_for_standard(i,check,argc);
- }else{
- check=tail_for_file(i,check,argc,argv[i]);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement