簡體   English   中英

如何在C ++中從文本文件中刪除空行?

[英]How to delete an empty line from text file in C++?

我在大學學習編程已有一年左右的時間,並且在此過程中已經學到了一些東西,因此我決定制作自己的“主機編輯器”程序,該程序基本上可以編輯Windows主機文件,讓您插入,刪除和管理內部的網址。 :)

但是,嘗試從文件中刪除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;

}

由於已將其標記為C ++,因此我假設您要重寫它以消除C FILE接口。

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

非常簡單!

您沒有說過這段代碼是如何失敗的(或者以文本為例),但是我注意到您的循環存在問題。 “文件末尾”條件是由於嘗試讀取文件末尾的行為而引起的,但是您在fgets 之前進行了測試( feof ),因此您對最后一行進行了兩次操作:控件在輸入后進入循環讀取最后一行,嘗試-失敗-讀取另一行,對仍在str的行進行操作,然后終止循環。

代替

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

嘗試:

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

原因

fgets()函數讀取包含尾隨行尾字符( '\\n' )的行,而puts()函數寫入傳遞給in的行行尾字符。 所以如果你讀

this line

它存儲為

this line\\n

str 並寫回為

this line\\n\\n

看起來像這樣

this line

在文件中。

固定

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM