linux c编程问题
要求把文件a.txt中的abc替换成1234
1.假设文件内容如下,先把文件内容读到内存里
kjahdkjhakabchajdklajabcbjkahkjhkajhk
2.创建文件a.tmp,在上面的字符串里找到abc第一次出现的位置,把第一个abc之前的的内容kjahdkjhak写到a.tmp里去,然后把abcd写到a.tmp里去
3.对上述字符串跳过abc三个字符串,继续找第二次出现的位置,把第一个abc之后的内容hajdklaja写到a.tmp里去,再把abcd写到a.tmp里去,继续这个操作,直到结尾
4.删除a.txt,然后将a.tmp命名为a.txt
依照上述流程写的代码如下,但实现不了替换的功能,请教高手指点
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc, char **argv)
{ int fd1,fd2;
char *filename1;
char *filename2;
char *src, *dest;
char *content;
char *p;
char *tmp;
struct stat st;
int size;
if(argc != 5)
{
printf("%1 filename source_string dest_string\n", argv[0]);
return 0;
}
filename1 = argv[1];//filename1 =a.txt
filename2=argv[2];//filename2=a.tmp
src = argv[3];//src =abc
dest = argv[4];//dest =abcd
fd1 = open(filename1, O_RDONLY);//打开a.txt
if(fd1 < 0)
{
printf("Open file failed:%s\n", strerror(errno));
return 0;
}
fstat(fd1, &st);
printf("File size:%d\n", st.st_size);
content = (char *)malloc(st.st_size+1);
if(content == NULL)
{
close(fd1);
printf("No enough memory\n");
return 0;
}
size = read(fd1, content, st.st_size);//将内容读到内存里
if(size <= 0)
{
return 0;
}
content[size] = '\0';
fd2=open(filename2,O_WRONLY|O_CREAT|O_APPEND);//创建a.tmp,查找并替换
tmp=content;
while(1)
{
p=strstr(tmp,src);
if(p == NULL)
{
write(fd2,content,strlen(content));
break;
}
write(fd2,tmp+(strlen(p)-strlen(tmp)),strlen(p)-strlen(tmp)+1);
write(fd2,dest,strlen(dest));
tmp=p+strlen(src);
}
rmdir(filename1);
close(fd2);
return 0;
运行程序输入a.txt a.tmp abc abcd
程序结果为abcdabcdabcdkjahdkjhakabchajdklajabcbjkahkjhkajhk
[解决办法]
人家是第一次发帖,结贴率可不是0嘛
几个小问题:
1、需要添加权限
fd2=open(filename2,O_WRONLY|O_CREAT|O_APPEND, 0666)
2、rmdir 是用来删除目录的,不是删除文件,改用unlink
3、正常情况下,没有close(fd1)
感觉还是后面的写入逻辑有问题,仔细跟踪一下吧
[解决办法]
write(fd2,tmp+(strlen(p)-strlen(tmp)),strlen(p)-strlen(tmp)+1);
-----》
write(fd2,tmp,p-tmp);