2012-04-20 63 views
0

我正在尝试编写一个名为replace的linux命令,它将替换文件中的字符。我希望把它像这样:通过命令行替换字符

$./replace I XY test.txt 

在这个例子中,test.txt包含单词“这是一个测试文件”

我怎么能替换字符'I'"XY"。我试图使用一个缓冲区,例如下面给出的代码,但由于缓冲区和argv声明不同,它会产生一个错误。此外,'I'存储在一个数组元素中,而"XY"需要两个。有没有解决这个问题的方法?

考虑text.txt例如:

在这个例子中,第三个指标(其中包含'I')必须"XY"

更换这里是我的代码,它具有上述问题:

#define BUFFERSIZE 4096 

/*replace i xy data.txt */ 
int main(int ac, char *av[]) 
{ 
    int in_fd, out_fd, n_chars, BufElement,j; 
    char buf[BUFFERSIZE]; 
    in_fd=open(av[3], O_RDWR); 

    /*Read characters from file to buffer*/ 
    while ((nread = read(in_fd , buf, BUFFERSIZE)) > 0) 
    { 
     for (BufElement=0;BufElement < nread;BufElement++) 
     { 
      for (j=0; j < strlen(av[1]); j++) 
      { 
       if (buf[BufElement] == av[1][j]) 
        buf[BufElement] = av[2]; /*ERROR*/ 
      }/*for*/ 
     }/*for*/ 
    }/*while*/ 
}/*main*/ 
+0

为什么不直接在这里发布代码? – slartibartfast 2012-04-20 06:23:00

+0

可能重复的[如何替换c中的子字符串](http://stackoverflow.com/questions/3659694/how-to-replace-substring-in-c) – 2012-04-20 06:27:28

回答

1

buf[BufElement]是一个字符,av[2]是一个字符串(字符p特别是)。你不能像你所做的那样将两者等同起来(buf[BufElement] = av[2];)另外,即使有可能,你也无法简单地用C中的缓冲区中的2个字节替换1个字节。它将覆盖下一个字符。

您需要复制文件内容,直到在临时缓冲区中找到匹配项,然后将替换字符串附加到此临时缓冲区,然后复制文件的其余内容。

+0

所以只是为了验证。我将“这是一个测试文件”逐个字符地复制到缓冲区。当我复制时,我检查argv [2] == i。如果匹配,则将X Y放入缓冲区,并将文件的其余部分复制到缓冲区中。但后来我必须具体说如果argv [2] =='我'然后把XY。用户应该能够用他选择的字符替换任何字符 – 2012-04-20 06:41:45

+0

是的,正确的,在这些lines.if(buffer [i] == argv [1] [0]),然后缓冲[i] ='X' ,缓冲区[i + 1] ='Y',然后继续缓冲区[i] = fgetc(fp) – 2012-04-20 06:43:34

+0

感谢您的回复先生。有没有这样做的一般方法?缓冲液[I] = 'X'。例如,如果用户输入$。/替换I ZS test.txt,那么我应该用Z和S替换。因此,为什么我把缓冲区[i] = argv [2](但当然这是错误) – 2012-04-20 06:48:26