我想删除文本文件中的给定行,因此我使用临时文件写入除我们要删除的行之外的所有行。
除了文件的最后一行,一切都没问题:当我想删除最后一行时,结果是一个空行代替删除的行,但它应该没有任何内容而不是空行
char line[255];
unsigned int countline=0;
unsigned int linetodelete;//fixed by the user
FILE *file=fopen(filename,"r");
FILE *filetemp=fopen("__tempfile__","w");
while(fgets(line,255,file)!=NULL){
if(countline!=linetodelete)
fputs(line,filetemp);
countline++;
}
fclose(file);
fclose(filetemp);
file=fopen(filename,"w");
filetemp=fopen("__tempfile__","r");
while(fgets(line,255,filetemp)!=NULL)
fputs(line,file);
fclose(file);
fclose(filetemp);
remove("__tempfile__");
文件示例:(我添加行号以说明我们在文件中可以看到的内容)
000 line0
001 line1
002 line2
要求删除第1行(001)时的结果:
000 line0
001 line2
要求删除第2行(002)时结果:
000 line0
001 line1
002
看到空行?为什么是这样 ?怎么处理呢?感谢
编辑:精确度
#include <stdio.h>
#include <stdlib.h>
void deleteline(const char *filename,unsigned int linetodelete){
FILE *file=fopen(filename,"r");
FILE *filetemp=fopen("__tempfile__","w");
char line[255];
unsigned int countline=0;
while(fgets(line,255,file)!=NULL){
if(countline!=linetodelete)
fputs(line,filetemp);
countline++;
}
fclose(file);
fclose(filetemp);
rename("__tempfile__",filename);
}
void print(const char *filename){
FILE *file=fopen(filename,"r");
char line[255];
unsigned int countline=0;
while(fgets(line,255,file)!=NULL){
printf("%03d ", countline);
printf("%s",line);
countline++;
}
printf("\r\n");
fclose(file);
}
int main(){
printf("before\n");
print("test.txt");
deleteline("test.txt",2);
printf("after\n");
print("test.txt");
}
之前:
cat -n test.txt
1 line0
2 line1
3 line2
之后:
cat -n test.txt
1 line0
2 line1
以下是我在文件编辑器中的内容:
学期:
答案 0 :(得分:0)
除了文件的最后一行之外的所有行都有一个'\n'
字符。当然,倒数第二行有它。
当你删除最后一行时,显然输出不会像以前那样相似,因为之前没有'\n'
的最后一行现在有它(它来自以前是倒数第二行的原因。)
我写过这篇文章并且我不太喜欢它,但是如果它能帮助您了解更好的解决方案......
void deleteline(const char *filename,unsigned int linetodelete){
FILE *file=fopen(filename,"r");
FILE *filetemp=fopen("__tempfile__","w");
char line[255];
unsigned int last = 0;
while(fgets(line,255,file)!=NULL){
last++;
}
last--;
rewind(file);
unsigned int countline=0;
while(fgets(line,255,file)!=NULL) {
if (linetodelete != last) {
if (countline != linetodelete)
fputs(line, filetemp);
}
else {
if (countline == linetodelete - 1)
line[strlen(line) - 1] = '\0';
if (countline != linetodelete)
fputs(line, filetemp);
}
countline++;
}
fclose(file);
fclose(filetemp);
rename("__tempfile__",filename);
}
答案 1 :(得分:0)
您可以使用此转变:
if(countline!=linetodelete){
char *p = line;
p[strlen(p)-1] = 0;
if(countline == 0){
fprintf(filetemp, "%s", p);
}
else{
fprintf(filetemp, "\n%s", p);
}
}
这样,您可以避免文件末尾的空白行。