[英]Deleting last line from file in C - creates empty line
我想刪除文本文件中的給定行,所以我使用一個臨時文件寫入除我們要刪除的行以外的所有行。
一切正常,除了文件的最后一行:當我想刪除最后一行時,結果是空行代替刪除的行,但是它應該沒有任何內容而不是空行
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
這是我在文件編輯器中得到的:
術語:
除了文件的最后一行外,所有行上都有一個'\\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);
}
您可以使用以下解決方法:
if(countline!=linetodelete){
char *p = line;
p[strlen(p)-1] = 0;
if(countline == 0){
fprintf(filetemp, "%s", p);
}
else{
fprintf(filetemp, "\n%s", p);
}
}
這樣,您可以避免在文件末尾出現空白行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.