从C中的文件中删除最后一行 - 创建空行

时间:2016-11-30 23:13:45

标签: c

我想删除文本文件中的给定行,因此我使用临时文件写入除我们要删除的行之外的所有行。

除了文件的最后一行,一切都没问题:当我想删除最后一行时,结果是一个空行代替删除的行,但它应该没有任何内容而不是空行

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 

以下是我在文件编辑器中的内容:

http://imgur.com/8Wbiwk2

学期:

http://imgur.com/WGNSmgf

2 个答案:

答案 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);
    }
}

这样,您可以避免文件末尾的空白行。