2012-08-03 54 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"