アプリ版:「スタンプのみでお礼する」機能のリリースについて

1行あたりIPアドレスが1つ書いてあるテキストファイルから、指定したIPアドレスを削除するプログラムを作成しています。

r+モードでfoepnした後にfgetsで一行ずつ読み取り、指定されたIPアドレスかどうかをチェックし、該当すればその行をNULLで埋め尽くしているのですが、サクラエディタなどで開くとその行が削除ではなくNULL文字で埋め尽くされているといった現象になります。
削除するにはどうすればよいでしょうか?

ipaddress.txt
---------------------
192.168.0.1(\n)
192.168.0.2(\n)
192.168.0.3(\n)
---------------------

以下、コード
bool DeleteAllowIP(char *ipaddr)
{
  FILE*fp;
  charszBuf[256];
  intleng = 0;
  longposi=0;

  // 初期化
  FillMemory(szBuf, sizeof(szBuf), 0);

  // ファイルオープン(追記)
  if(fopen_s(&fp, AllowPath, "r+"))
    return FALSE;
  // 削除
  while (NULL != fgets(szBuf, sizeof(szBuf), fp)){  // 1行読み取る
    if(NULL != (strstr(szBuf, ipaddr))){  // 削除IPに合致するIPを検索
      fseek(fp, posi+1, SEEK_SET);  // 削除する先頭行セット
      leng = strlen(szBuf) - 1;  // 改行を除く文字数を取得
      while(leng>=0){  // 文字数分'\0'をセット
        fseek(fp, posi+leng-1, SEEK_SET);
        leng--;
        fputc('\0', fp);
      }
      fseek(fp, posi+1, SEEK_SET);  // 次の行の先頭にセット
    }
    posi = ftell(fp);
  }
  // ファイルクローズ
  fclose(fp);
  return TRUE;
}

A 回答 (2件)

以下は1つのアイデアです。



1)削除前のファイル(A)を読込み用で、削除後のファイル(B)を書込み用で、それぞれオープンする。
2)Aを1行読む。
3)残しておきたいデータならば、Bに書込む。
4)前2項を、Aを読み終わるまで繰り返す。
5)AとBをクローズする。
6)BをAにコピーする。
7)Bを削除する。
8)おしまい。
    • good
    • 1
この回答へのお礼

有難う御座います。

ご教授頂きましたAとBのファイルを作成するやり方で実現できました('-'*)

一つのファイル内で文字列の一部を削除するようなやり方は難しいみたいですね。

有難う御座いました^^

お礼日時:2010/01/31 18:53

>該当すればその行をNULLで埋め尽くしているのですが


NULLで埋め尽くす必要ありません
その行を書き込まなければいいだけです
(ソース全部見てませんが読み込みポインタと書き込みポインタを別に持ってちゃんと管理する必要があるかもしれません)

もし別のファイルに書くのであればそれこそ単純にその行を書かなければいいだけの話
処理が終わった後にファイルコピーなどしてファイル上書きしてもいいでしょう
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!