아이디어:
1. 프로세스에서 open()은 파일을 엽니다. 각 라인의 끝이 '\n'이기 때문에 파일의 11번째 라인에 대한 파일 포인터를 찾을 수 있고 후속 데이터 read()를 배열, 그런 다음 파일의 포인터를 열 번째 줄로 재배치하고 방금 데이터를 저장한 배열을 쓰고 파일의 현재 포인터를 읽고 마지막으로 ftruncate()를 사용하여 파일을 자릅니다.
2. 한 프로세스에서 open()은 파일을 두 번 엽니다. 하나는 읽기 전용이고 다른 하나는 읽기-쓰기입니다. 읽기 전용 파일 포인터는 파일의 11번째 줄에 있고 읽기-쓰기 파일 포인터는 다음 위치에 있습니다. 파일의 10번째 줄 데이터는 차례로 read() 복사 write()를 읽기-쓰기 파일 포인터 뒤에 쓰고 마지막으로 fruncate()는 읽기-쓰기 파일 포인터 뒤에 있는 내용을 자릅니다.
코드
나는 두 번째 방법을 사용합니다. 아이디어는 이해하기 쉽습니다.
#include <sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fd1,fd2;
int rpos = 0, wpos = 0,pos = 0;//读取位置,写入位置,当前位置
char str[2]; //临时数组
int row = 0; //行数判断
int trun_num =0 ; //需要截断的位置
//如果传入参数不够,给出提示
if(argc < 2) {
printf("Usage...\n");
exit(1);
}
//只读方式打开
fd1 = open(argv[1],O_RDONLY);
if(-1 == fd1){
perror("open()");
exit(1);
}
//以读写方式打开
fd2 = open(argv[1],O_RDWR);
if(-1 == fd2){
perror("open()");
exit(1);
}
//找到读取位置
while(1){
if(row == 10) {
rpos = pos;
break;
}
if(read(fd1,str,1) <= 0) break;
//printf("%s\n",str);
if(str[0] == '\n') row = row+1;//判断是否到了一行的截止
pos = pos + 1;
}
pos = 0;
row = 0;
//找到写入位置
while(1){
if(row == 9) {
wpos = pos;
break;
}
if(read(fd2,str,1) <= 0) break;
if(str[0] == '\n') row = row+1;//判断是否到了一行的截止
pos = pos + 1;
}
//读取数据写入文件
while(1){
if(read(fd1,str,1)<= 0) break;
write(fd2,str,1);
}
//从写入位置开始截断
trun_num = lseek(fd2,0,SEEK_CUR);
ftruncate(fd2,trun_num);
close(fd1);//关闭文件
close(fd2);
exit(0);
}
요약하다
위의 코드는 이미 파일의 10번째 줄을 삭제할 수 있지만 조금 번거롭습니다.먼저 쓰기 위치를 찾은 다음 읽기 위치를 찾는 것이 더 쉽습니다.