- ベストアンサー
テキストファイルの文字列の削除
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; char szBuf[256]; int leng = 0; long posi=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; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
以下は1つのアイデアです。 1)削除前のファイル(A)を読込み用で、削除後のファイル(B)を書込み用で、それぞれオープンする。 2)Aを1行読む。 3)残しておきたいデータならば、Bに書込む。 4)前2項を、Aを読み終わるまで繰り返す。 5)AとBをクローズする。 6)BをAにコピーする。 7)Bを削除する。 8)おしまい。
その他の回答 (1)
- koi1234
- ベストアンサー率53% (1866/3459)
>該当すればその行をNULLで埋め尽くしているのですが NULLで埋め尽くす必要ありません その行を書き込まなければいいだけです (ソース全部見てませんが読み込みポインタと書き込みポインタを別に持ってちゃんと管理する必要があるかもしれません) もし別のファイルに書くのであればそれこそ単純にその行を書かなければいいだけの話 処理が終わった後にファイルコピーなどしてファイル上書きしてもいいでしょう
お礼
有難う御座います。 ご教授頂きましたAとBのファイルを作成するやり方で実現できました('-'*) 一つのファイル内で文字列の一部を削除するようなやり方は難しいみたいですね。 有難う御座いました^^