Untitled
unknown
plain_text
a year ago
3.5 kB
11
Indexable
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #define BUF_SIZE 4096 char *base2(char octal) { switch(octal) { case '0': return "000"; case '1': return "001"; case '2': return "010"; case '3': return "011"; case '4': return "100"; case '5': return "101"; case '6': return "110"; case '7': return "111"; default: return NULL; } } int main(int argc, char *argv[]) { int input_fd,output_fd; char buffer[BUF_SIZE]; ssize_t bytes_in; if(argc<2) { printf("Usage: cp file_src file_dest.\n/"); return 1; } else if(argc<3) { char temp[]="temporarXXXXXX"; int temp_fd=mkstemp(temp); if(temp_fd==-1) { perror("Eroare la fisierul temporar."); return 2; } close(temp_fd); temp_fd=open(temp,O_RDWR|O_CREAT,0600); if(temp_fd==-1) { perror("Eroare la deschiderea fisierului temporar."); return 3; } input_fd=open(argv[1],O_RDWR); if(input_fd==-1) { perror("Eroare la primul fisier."); return 4; } while((bytes_in=read(input_fd,buffer,BUF_SIZE))>0) { for(int i=0;i<bytes_in;i++) { if(buffer[i]>='0' && buffer[i]<='7') { char *binar=base2(buffer[i]); write(temp_fd,binar,3); } else write(temp_fd,&buffer[i],1); } } if(lseek(temp_fd,0,SEEK_SET)==-1) { perror("Eroare la functia lseek."); return 5; } lseek(input_fd,0,SEEK_SET); while((bytes_in=read(temp_fd,buffer,BUF_SIZE))>0) { int bytes_out=write(input_fd,buffer,bytes_in); if(bytes_in!=bytes_out) { printf("Fatal write error."); return 6; } } close(input_fd); close(temp_fd); } else { input_fd=open(argv[1],O_RDONLY); if(input_fd==-1) { perror("Eroare la primul fisier."); return 7; } output_fd=open(argv[2],O_WRONLY|O_CREAT); if(output_fd==-1) { perror("Eroare la al doilea fisier."); return 8; } struct stat st; stat(argv[2],&st); if(st.st_size>0) { printf("Doriti suprascrierea fisierului? (Y/N): "); char rez; scanf("%c",&rez); if(rez!='Y') { close(input_fd); close(output_fd); return 9; } else { int result=ftruncate(output_fd,0); if(result!=0) { perror("Nu a avut loc trunchierea."); close(input_fd); close(output_fd); return 10; } } } while((bytes_in=read(input_fd,buffer,BUF_SIZE))>0) { for(int i=0;i<bytes_in;i++) { if(buffer[i]>='0' && buffer[i]<='7') { char *binar=base2(buffer[i]); write(output_fd,binar,3); } else write(output_fd,&buffer[i],1); } } close(input_fd); close(output_fd); } return 0; } //sugi?
Editor is loading...
Leave a Comment