2

我在大学里已经学习编程大约一年了,一路上我学到了一些东西,所以我决定制作我自己的“主机编辑器”程序,它基本上可以编辑你的 Windows 主机文件,让你插入、删除和管理里面的网址。:)

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

但是,如果不离开所谓的“空行” ,我就无法删除 URL 。至少不是我的编码方式......我已经尝试了一切,我真的需要你的帮助。

但是请在这里和我一起使用“noob友好”的语言,我不会理解任何复杂的术语:)

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

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

3 回答 3

5

由于您已将其标记为 C++,因此我假设您要重写它以消除 CFILE接口。

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

很直接!

于 2012-08-03T11:31:30.623 回答
0

原因

fgets()函数读取包含尾随行尾字符 ( '\n') 的行,而puts()函数写入传递给 in的行行尾字符。所以如果你读

this line

它存储为

this line\n

str. 并写回文件为

this line\n\n

看起来像这样

this line

在文件中。

使固定

  • 利用fprintf(fp2, "%s", str);
  • 使用前删除拖尾"\n"strfputs()
于 2012-08-03T12:32:57.943 回答
0

你还没有说这段代码是如何失败的(或者给了我们一些文本作为例子),但我注意到你的循环有问题。“文件结束”条件是由于试图读取文件末尾的行为引起的,但是您在之前执行了test ( feof) ,因此您对最后一行进行了两次操作:控制在最后一行之后进入循环被读取,尝试 - 并且失败 - 读取另一行,作用于仍在 中的行,然后终止循环。fgetsstr

代替

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

尝试:

while(fgets(str,200,fp))
{
  ...
于 2012-08-03T11:49:28.010 回答