如何修复自己的tr函数版本?

时间:2019-03-31 00:29:58

标签: c

我正在开发tr函数的简化版本,其结构如下:

mytr char1 char2 file1 file2。

目前,我要执行的唯一功能是将file1中的char1替换为file2中的char2。截至目前,我只能在file2中复制file1的内容,但字符不会更改。我已经用西班牙语设置了函数的名称,所以这里是翻译: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 :(得分:0)

这似乎并不能解决您的麻烦,但这行

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以获取期望的确切参数数量。