Как исправить мою собственную версию функции tr? - PullRequest
0 голосов
/ 31 марта 2019

Я работаю над упрощенной версией функции tr, структура выглядит следующим образом:

mytr char1 char2 file1 file2.

Пока единственная функция, которую я хочу сделать, - это заменить char1 в file1 на char2 в file2. На данный момент я могу копировать только содержимое файла file1 в файл file2, но символы не меняются. Я установил названия функций на испанском языке, поэтому вот переводы: Abrir -> Open; Cerrar -> Закрыть; Лер -> Читать; daerror -> показывает сообщение о том, какой должна быть реализация.

Я знаю, что не использовал функцию Leer, но я не был уверен на 100%, правильно ли это, поэтому я просто использовал функцию чтения.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <string.h>

int Abrir(char* nombre)
{
    int result;
    result=open(nombre,O_RDONLY);
    return result;

}

int Cerrar(int fd){
    if(close(fd)==-1){
      fprintf(stderr,"error al cerrar el fichero\n");
      exit(-1);
    }
}

char Leer(int fd){
  char car;
  int nbytes;
    nbytes=read(fd,&car,sizeof(char));
    if(nbytes==-1){
    fprintf(stderr,"Error en la lectura del fichero\n");
    exit(-1);
    }
    if(nbytes==0){
      return car;
      // car='\0';
    }
    return car;
}

void daerror(){
    printf("Utilizacion funcion: mitr caracter1 caracter2 fichero1 fichero2 <Cambia los caracteres de 1 en 2 y lo pone en el fichero2>\n");
}

void main(int argc, char* argv[]){
    int arch2;
    if(argc>0){
            char* cadena1=argv[2];
            char* cadena2=argv[3];
            char* ficheroabrir=argv[4];
            char* ficherocrear=argv[5];
            int arch1=Abrir(ficheroabrir);
            int arch2=Abrir(ficherocrear);
            char c;
            if(arch1==-1){
                printf("no existe el fichero origen");
                exit(-1);
            }else if(arch2==-1){
                printf("entra aqui");
                                int fd2 = open(ficherocrear,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
                while(read(arch1,&c,sizeof(c)!=0)){

                    if(c!=*cadena1){
                    write(fd2,&c,sizeof(c));

                    }else{
                        write(fd2,&cadena2,sizeof(char));
                    }
                }   
                Cerrar(fd2);
                Cerrar(arch1);
                exit(0);
            }


    }else{
        daerror();
    }

}

Мой вывод просто помещает содержимое файла file1 в file2, но не вносит изменения char1 в char2

1 Ответ

0 голосов
/ 31 марта 2019

Кажется, это не объясняет вашу проблему, но эта строка

while(read(arch1,&c,sizeof(c)!=0))

должно быть

while(read(arch1,&c,sizeof(c))!=0)

или даже лучше

while(read(arch1, &c, 1) == 1)

, который также поймает -1 возвращено.

Обратите внимание, что

write(fd2,&cadena2,sizeof(char));

должно быть

write(fd2, cadena2, 1);

потому что cadena2 уже указатель.


Вы неправильно используете аргументы программы, судя по вашему выводу "Utilizacion":
  • argv[1] символ 1
  • argv[2] символ 2
  • argv[3] имя файла 1
  • argv[4] имя файла 2

и вы должны проверить argc на точное количество ожидаемых аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...