linux 拷贝部分文件内容,linux文件内容拷贝的有关问题

本文介绍了如何使用C/C++编程实现Linux环境下,根据特定字符串'abcd'定位文件内容,将字符串前的内容复制到一个文件,字符串后的内容复制到另一个文件。通过逐字节读取和处理,确保了对文件的精确分割操作。
摘要由CSDN通过智能技术生成

C/C++ code#include

#include

#include

#include

int main(void)

{

char str[50]="";

printf("please input the separative string, ex. \"abcd\"\n");

scanf("%s",str);

int fd1=open("file.txt",O_RDONLY);

if(fd1==-1) perror("open file.txt failed"),exit(-1);

int fd2=open("befor.txt",O_RDWR|O_CREAT|O_TRUNC,0666);

if(fd2==-1) perror("create befor.txt failed"),exit(-1);

int fd3=open("after.txt",O_RDWR|O_CREAT|O_TRUNC,0666);

if(fd3==-1) perror("create after.txt failed"),exit(-1);

char first=' ';

int len=strlen(str);

char buff[len];

buff[len-1]='\0';

int readCount;

while((readCount=read(fd1,&first,1))!=0)

{

if(readCount==-1) printf("error\n"),exit(-2);

if(first==str[0]) {//先比较第一个字符是不是'a';

read(fd1,buff,len-1);

if(strcmp(buff,str+1)==0) {//如果第一个字符是'a',就接着比较'a'后面的字符串

off_t afterBeg=lseek(fd1,0,SEEK_CUR);//后半段的开始位置

off_t beforEnd=lseek(fd1,-len,SEEK_CUR);//前半段的结束位置

off_t beforBeg=lseek(fd1,0,SEEK_SET);

long beforSize=beforEnd-beforBeg;

int count=0;

int lastRead=beforSize%256;//每次读256个字节,最后一次读的大小

while(count

char fileBuff[256]="";

int readSize=read(fd1,fileBuff,sizeof(fileBuff));

if(readSize==-1) perror("read failed"),exit(-3);

count+=readSize;

write(fd2,fileBuff,readSize);

}

char fileBuff[256]="";

int readSize=read(fd1,fileBuff,lastRead);

write(fd2,fileBuff,lastRead);

close(fd2);

lseek(fd1,afterBeg,SEEK_SET);//将后半段写到after.txt

while(readSize=read(fd1,fileBuff,sizeof(fileBuff))) {

if(readSize==-1) perror("read failed"),exit(-3);

write(fd3,fileBuff,readSize);

}

close(fd1);

close(fd3);

return 0;

}else {

lseek(fd1,-(len-1),SEEK_CUR);//第一个字符是'a',但是后面不匹配,就要回退len-1字节

continue;

}

}

}

printf("string:%s not found in file\n",str);

return 1;

}

------解决方案--------------------

找abcd是有编程技巧的,因为可能abcd被两次读入, 所以每一次读入前应该将前一次读入的末尾3个字符留在缓冲区内, 再次读的数据追加到缓冲区, 在里面找abcd, 祝你能理解这个的重要性。

------解决方案--------------------C/C++ code/*****

请问:

在linux中,需要把文件出现abcd字符之前的部分拷贝到一个文件中,abcd及之后的内容拷贝到另外一个文件中,

请问怎么用linux shell脚本或者linux C编程实现?

*****/

#include

#include

#include

int main()

{

FILE *fp;

FILE *before;

FILE *after;

char *p = NULL;

int ch;

char *separate_str = "abcd";

int SIZE = strlen(separate_str);

char queue_str[SIZE+1];//用数组作为队列,用来缓存从文件中读出的字符

if ((fp = fopen("file.txt", "r")) == NULL)

{

printf("open file.txt error !");

exit(1);

}

if ((before = fopen("before.txt", "w")) == NULL)

{

printf("open before.txt error !");

exit(1);

}

if ((after = fopen("after.txt", "w")) == NULL)

{

printf("open after.txt error !");

exit(1);

}

fgets(queue_str, SIZE, fp);

while ((ch = fgetc(fp)) != EOF)

{

queue_str[SIZE - 1] = ch;

if (strcmp(queue_str, separate_str) != 0)

{

fputc(ch, before);

}

else

{

break;

}

p = &queue_str[1];

strcpy(queue_str, p);

}

fseek(before, -3, SEEK_END);

fputc('\0', before); //delete the last string "abc" in file before.txt

fputc('\0', before);

fputc('\0', before);

while ((ch = fgetc(fp)) != EOF)

{

fputc(ch, after);

}

fclose(fp);

fclose(before);

fclose(after);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值