我正在开发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
答案 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
已经是一个指针。
argv[1]
字符1 argv[2]
字符2 argv[3]
文件名1 argv[4]
文件名2 ,您必须检查argc
以获取期望的确切参数数量。