永发信息网

c语言删除文件指定的某一行

答案:1  悬赏:60  手机版
解决时间 2021-02-01 13:33
c语言删除文件指定的某一行
最佳答案
这个程序适用于文件不是很大的情况,最好不要大于2G
先说思路,把文本文件按行读入内存,在内存中的结构是一个双向链表,每一个链表节点放一行。
文本文件 a.txt 先准备好,比如内容如下:
this is line 1
this is line 2
this is line 3
this is line 4
this is line 5
this is line 6
//以下是代码
#include
#include
#include
typedef struct lnode{ //define line node
struct lnode *prev;
struct lnode *next;
char *line;
} lnode;
typedef struct line_in_mem{
lnode *head;
lnode *tail;
} line_in_mem;
lnode *newnode(void){ // return a node in heap
return (lnode *)malloc(sizeof(lnode));
}
lnode *get_position(line_in_mem *lines){ // prepare an lnode whose line is NULL, to store a line read from file
lnode *node = newnode();
if(!node)
return NULL;
node->prev = node->next = NULL;
if(lines->head == NULL)
lines->head = lines->tail = node;
else{
lines->tail->next = node;
node->prev = lines->tail;
lines->tail = node;
}
return node;
}
void readfile(line_in_mem *lines, FILE *file){ // read lines from file and store them in struct line_in_mem
char *buf = NULL;
int n = 0;
while(getline(&buf, &n, file) > 0){
lnode *node = get_position(lines);
if(node)
node->line = buf;
else
exit(-1);
buf = NULL;
}
}
static void print_line(line_in_mem *line){ // show lines in mem, which may not be needed
lnode *node;
for(node = line->head; node ; node = node->next){
printf("%s", node->line);
}
}
void delete_line(line_in_mem *line, int line_no){ //given a line number, delete it from the list. if line_no is less than 0 or bigger than total of lines, do nothing
lnode *node = line->head;
while(--line_no > 0 && node)
node = node->next;
if(!node)
return;
if(node->prev)
node->prev->next = node->next;
if(node->next)
node->next->prev = node->prev;
free(node);
}
void savefile(line_in_mem *lines, FILE *file){ //truncate file to 0 and write back
freopen("a.txt","w",file);
lnode *node;
for(node = lines->head; node; node = node->next){
fwrite(node->line, sizeof(char), strlen(node->line)/sizeof(char), file);
}
}
int main(){
line_in_mem lines;
lines.head = lines.tail = NULL;
int line_no = 3;
FILE *file = fopen("a.txt","r");
if(!file)
return -1;
readfile(&lines, file); //read file into mem. the struct of file in mem is a list of line
print_line(&lines);
printf("---------------\n");
delete_line(&lines, line_no); //delete line_no in mem
print_line(&lines);
savefile(&lines, file); //write back
fclose(file);
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
龙工叉车专营店地址在什么地方,想过去办事
僧纲的意思是什么啊?知道的请说下!
斗战神65混沌武器怎么升级70
电子邮箱免费注册
从国贸到深圳西怎么走,坐几路车
知情的意思是什么啊?知道的请说下!
下列变化中不包含化学变化的是CA. 光合作用B.
待续咖啡地址在哪,我要去那里办事
苹果iPhone 4(16GB)手机标价4999元,小张最
遐福的意思是什么啊?知道的请说下!
北京一证通如何激活
karma和大疆哪个好
金华市技师学院几月份发毕业证书
环氧树脂AB透明胶的价格是多少?如果买量大能
芦根具有的功效是A.除烦、止呕、利尿B.除烦、
推荐资讯
fa开头的是什么牌子的衣服
有事打电话地方很多
郑州市机动车大概多少个
请问:走国际航运,从国外邮寄东西到中国,必
职业中专地址在什么地方,想过去办事
各位帮帮忙,我在深圳买的社保现在想转到湖北
为什么肚子饿了就会放屁?
上司是大家一致认为的小人,我因为工作原因和
Giant(捷安特)商丘香君路专卖店地址在哪,我
南京一中属于哪个区
父亲生病住院了, 我哥我姐很少照顾,都不出愿
结爱的意思是什么啊?知道的请说下!
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?