2012-08-03 90 views
2

我一直在大學學習編程大約一年,我學到了一些東西,所以我決定讓我自己的「主編輯」程序基本上編輯你的Windows主機文件,讓你插入,刪除和管理裏面的網址。 :)如何從C++文本文件中刪除空行?

但是,我試圖從文件中刪除一個URL時遇到了問題。因爲我不知道如何去做,所以我並沒有真正刪除它,但我創建了一個新的空文本文件,然後複製除了我想要刪除的URL之外的所有行。聽起來合理嗎?

然而,似乎我不能刪除該URL而不會離開所謂的「空行」。至少與我編碼的方式不同......我嘗試了一切,我真的需要你的幫助。

但是,請在這裏使用「小白友好」的語言和我在一起,我不明白任何複雜的術語:)

謝謝,這是我的全碼:

http://joggingbenefits.net/hcode.txt

和這裏只是我認爲與我混淆的代碼部分(刪除URL函數):

void del(int lin) // line index 
{ 
    FILE* fp=fopen("C:\\Windows\\System32\\drivers\\etc\\hosts","r+"); 
    FILE* fp1=fopen("C:\\Windows\\System32\\drivers\\etc\\hosts1","w"); 

    char str[200]; 
    int cnt=0; 

    while(! feof(fp)) 
    { 
     fgets(str,200,fp); 


     if(str[0]=='#') 
     { 
      fputs(str,fp1); 
     } 
     else 
     { 
      if(cnt==lin) 
      {    // problem. FLAG?! 
       cnt++; 
      } 
      else 
      { 
        cnt++; 
        fputs(str,fp1); 
      } 

     } 

    } 



    fclose(fp); 
    fclose(fp1); 

    rename("C:\\Windows\\System32\\drivers\\etc\\hosts","C:\\Windows\\System32\\drivers\\etc\\deleteme"); 
    rename("C:\\Windows\\System32\\drivers\\etc\\hosts1","C:\\Windows\\System32\\drivers\\etc\\hosts"); 
    remove("C:\\Windows\\System32\\drivers\\etc\\deleteme"); 

    cout << endl << "LINE DELETED!" << endl; 

} 
+4

你應該真的嘗試在這裏發佈相關的代碼。爲此,嘗試拿出一個最小的例子來展示你不想要的行爲並在這裏發佈。這也可以幫助你更好地理解它。除此之外,如果你真的想用C++編程,我建議你開始使用C++流來處理文件I/O。 – 2012-08-03 10:56:03

+0

我確實嘗試過,但編輯是誠實可怕的。它說,點擊這裏插入代碼,然後插入我的代碼,並將其格式化得非常糟糕,將一些代碼放在正常文本中,其他位放入代碼中。它還說,按TAB和'$',但是當我按TAB時,它會跳轉到頁面底部的標籤texbox ...我能說什麼 – Zannix 2012-08-03 11:13:59

+2

您只需粘貼代碼,突出顯示它,然後單擊*格式爲代碼*。 – 2012-08-03 11:16:02

回答

5

由於您已將此標記爲C++,因此我將假設t您要重寫它的帽子以消除界面。

std::ifstream in_file("C:\\Windows\\System32\\drivers\\etc\\hosts"); 
std::ofstream out_file("C:\\Windows\\System32\\drivers\\etc\\hosts1"); 

std::string line; 
while (getline(in_file, line)) { 
    if (! line.empty()) { 
     out_file << line << '\n'; 
    } 
} 

http://ideone.com/ZibDT

非常簡單!

+0

該程序刪除空行。如果你想在其他條件下過濾行,可以使用它來代替'line.empty()'。 – Potatoswatter 2012-08-03 11:59:19

0

您還沒有說過如何這段代碼失敗(或給我們一些文字作爲例子),但我注意到你的循環有問題。 「文件結束」狀態是由於嘗試讀取文件結尾而導致的,但是您在之前執行了測試(feof,fgets,因此您在最後一行操作了兩次:控制進入循環讀取最後一行後,嘗試 - 並且失敗 - 讀取另一行,作用於仍在str中的行,然後終止循環。

代替

while(! feof(fp)) 
    { 
    fgets(str,200,fp)) 
    ... 

嘗試:

while(fgets(str,200,fp)) 
{ 
    ... 
0

原因

fgets()函數讀取線包括末尾結束行字符('\n'),而puts()函數寫入傳遞給行在結尾字符。所以,如果你讀

this line

它存儲爲

this line\n

str

。和寫回該文件作爲

this line\n\n

它看起來像這樣

this line

文件中

修復

  • 使用fprintf(fp2, "%s", str);
  • 刪除使用fputs()str尾隨"\n"