如何从C ++中的文本文件中删除空行?

时间:2012-08-03 10:52:51

标签: c++

我在大学里已经学习了大约一年的编程,并且我已经学习了一些东西,所以我决定制作我自己的“主编”程序,它基本上编辑了你的windows hosts文件,允许您插入,删除和管理里面的URL。 :)

但是,尝试从文件中删除URL时遇到了问题。我实际上并没有删除它,因为我不知道该怎么做,但是我创建了一个新的空文本文件,然后复制除了我希望删除的URL之外的所有行。听起来很合理吗?

然而,似乎我不能删除网址而不留在所谓的“空行”内。至少不是我如何编码它...我已经尝试了一切,我真的需要你的帮助。

但请在这里使用“noob friendly”语言,我不会理解任何复杂的术语:)

谢谢,这是我的完整代码:

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;

}

3 个答案:

答案 0 :(得分:5)

由于您已将此标记为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

非常简单!

答案 1 :(得分:0)

你还没有说 这个代码失败了(或者给我们一些文本作为例子),但我注意到你的循环有问题。 “文件结束”条件是由尝试读取文件末尾的行为引起的,但您在<{em> feof之前进行了测试(fgets,所以你在最后一行操作两次:控制在读取最后一行之后进入循环,尝试 - 并且失败 - 读取另一行,作用于仍在str中的行,然后终止循环。

而不是

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

尝试:

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

答案 2 :(得分:0)

的原因

fgets()函数读取行包括尾随行尾字符('\n'),而puts()函数写入行传递给 end-of线条字符。所以如果你读了

this line

它存储为

this line\n

str中的

。并以

的形式写回文件

this line\n\n

看起来像这样

this line

在文件中。

修复

  • 使用fprintf(fp2, "%s", str);
  • 在使用"\n"之前删除str中的尾随fputs()