2011-04-19 60 views
0

我想從文件中刪除一行,當前我正在循環遍歷oldTodoFile中的每一行,如果lineNumber不等於todoNumber,則將它添加到一個新文件(todoFile)。它似乎並不是一種刪除線條的好方法,還有更好的方法來刪除線條嗎?更好的方式來刪除文件中的一行?

FILE *oldTodoFile; 
oldTodoFile = fopen("./todo.txt", "r"); 

FILE *todoFile; 
todoFile = fopen("./todo2.txt", "w"); 
int lineNumber = 0; 
int len; 
char line[4096]; 

if (oldTodoFile != NULL) { 
    while (fgets(line, sizeof line, oldTodoFile)) { 
     len = strlen(line); 
     if (len && (line[len - 1] != '\n')) {} else { 
      lineNumber++; 
      if (lineNumber == todoNumber) { 
       // Do nothing 
      } else { 
       fputs(line, todoFile); 
      } 
     } 
    } 
} else { 
    printf("ERROR"); 
} 
remove("./todo.txt"); 
rename("./todo2.txt", "./todo.txt"); 
fclose(oldTodoFile); 
fclose(todoFile); 
+1

非常相似:http://stackoverflow.com/questions/1151713/delete-a-line-from-a-file-in-c-language – 2011-04-19 21:52:36

+0

沒有出現在搜索:http:// stackoverflow。 COM /搜索?q =更好的方式+ +至+刪除+ A +線+在+ A +文件%3F – errorhandler 2011-04-19 21:54:25

回答

3

文件只是一系列字節。如果你想刪除一行,你必須在該行後面移動任何內容。我認爲你所做的只是很好,但你也可以從你正在刪除的行開始覆蓋文件。

要做到這一點,您需要兩個文件描述符指向文件。當你從第二個閱讀時,你會寫第一個。

當你完成後,你可以截斷文件以擺脫最後的額外數據。

1

不,就是這樣做。沒有辦法從文件中間刪除數據。

您可能希望在發生錯誤時修復代碼,但仍會嘗試在最後執行刪除/重命名。

0

如果您的操作系統支持內存映射文件,您可以將文件映射到映射文件,然後使用memmove()移動數據。它可能會也可能不會更有效率,但生成的代碼可能更容易實現,維護和調試。

它不一定是一種「更好」的方式,但它是需要考慮的事情。

相關問題