思路1:
lseek定位到第十一行的行首,然后读内容,然后再去定位,定位到第十行的行首,然后去覆盖写。整个内容是要包含在循环结构中的。
while()
{
lseek 11+read+lseek 10+write
}
最后这个文件会多出来一行长度,就是第十行的长度,最终的文件要进行截短,把多的一块截掉。
代码
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/stat.h>
4 #include<fcntl.h>
5 #include<string.h>
6 #include<unistd.h>
7 #include<stdlib.h>
8 #define BUFSIZE 1024
9 int main(int argc,char ** argv)
10 {
11
12 int f1,f2;
13 int ret,row=0,rpos=0,wpos=0,pos=0;
14 char buf[BUFSIZE]; //临时数组
15 if(argc<2) //如果传入参数不够,给出提示
16 {
17 fprintf(stderr,"用法错误 %d\n",argc);
18 exit(1);
19
20 }
21 //只读方式打开
22 f1=open(argv[1],O_RDONLY);
23 if(-1==f1)
24 {
25
26 perror("open()");
27 exit(1);
28 }
//以读写方式打开
30 f2=open(argv[1],O_RDWR);
31 if(-1==f2)
32 {
33
34 perror("open()");
35 exit(1);
36 }
37 //找到读取位置
38 while(1)
39 {
40 if(row==10)
41 {
42 lseek(f1,pos,SEEK_SET);
43 break;
44
45 }
46 if( read(f1,buf,1)<=0)break;
47 if(buf[0]=='\n')row++;
48
49 pos++;
50
51 }
52
53 pos=0;
54 row=0;
55
56 //找到写入位置
57 while(1)
58 {
59 if(row==9)
60 {
61 lseek(f2,pos,SEEK_SET);
62 break;
63
64 }
65 if( read(f2,buf,1)<=0)break;
66 if(buf[0]=='\n')row++;
67
68 pos++;
69
70 }
71
72 74 //读取数据写入文件
75 while(1){
76 if(read(f1,buf,1)<= 0) break;
77 write(f2,buf,1);
78
79 }
80 //从写入位置开始截断
81 ret = lseek(f2,0,SEEK_CUR);
82 ftruncate(f2,trun_num);
83 close(f1);//关闭文件
84 close(f2);
85 exit(0);
86 }
73
74
74,0-1 底端