首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

linux c编程有关问题

2012-04-22 
linux c编程问题要求把文件a.txt中的abc替换成12341.假设文件内容如下,先把文件内容读到内存里kjahdkjhaka

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);

热点排行