2

私は大学で約1年間プログラミングを学んでおり、その過程でいくつかのことを学んだので、基本的にWindowsホストファイルを編集し、挿入、削除、および削除できる独自の「ホストエディター」プログラムを作成することにしました。内部の URL を管理します。:)

しかし、ファイルから 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

3 に答える 3

5

FILEあなたはこれを C++ とタグ付けしたので、Cインターフェースを除去するために書き直したいと思っていると思います。

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

あなたはこのコードがどのように失敗するかを述べていません (または、例としていくつかのテキストを提供してくれました) が、あなたのループに問題があることに気付きました。「ファイルの終わり」状態は、ファイルの終わりを超えて読み取ろうとする行為によって引き起こされますが、テスト ( feof)を のfgets実行するため、最後の行で 2 回操作します。制御は最後の行の後にループに入ります。が読み取られ、別の行を読み取ろうとして失敗し、まだ にある行に作用してstr、ループを終了します。

それ以外の

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

試す:

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

理由

fgets()関数は末尾の行末文字 ( '\n') を含む行を読み取り、puts()関数は渡された行行末文字を書き込みます。だから読んだら

this line

として保存されます

this line\n

str。そして、次のようにファイルに書き戻されます

this line\n\n

このように見える

this line

ファイルで。

修理

  • 使用するfprintf(fp2, "%s", str);
  • を使用する前に末尾を削除"\n"してください。strfputs()
于 2012-08-03T12:32:57.943 に答える