dポイントプレゼントキャンペーン実施中!

C言語でテキストファイルを読み込んで、特定のキーワードを
見つけたら置換して、保存したいと考えています。
ネット上でテキストファイルの内容を置換して、保存するよう
な情報を検索したのですが、見つからず質問することにしました。

例)
hoge.txtを読みこんで、FLG=0となっている行を、FLG=1というように置換させたい。

FLG=0

FLG=1

A 回答 (3件)

FLG = 0;


FLG = 0x0000; => FLG=1
という行も置換するのですよね。
生産性を考えたら C# かPerlが便利だと思います。
    • good
    • 1

★『strstr』関数の方が便利ですよ。


・回答者 No.1 さんの『strcmp』関数で1文字ずつずらして比較するのが基本的な
 アルゴリズムですが、strstr 関数は文字列から指定文字列を探します。
 戻り値は見つかったポインタ位置を返します。見つからないと NULL を返します。
・簡単な置換アルゴリズムは
 (1)ファイルから行単位で読み込む
 (2)その文字列から検索文字列『FLG=0』を探す。
 (3)見つからない場合は文字列のすべてを置換後ファイルに書き出す。→(8)へ進む
 (4)見つかった場合は、行の先頭から発見された位置までを置換後ファイルに書き出す。
 (5)置換後の文字列『FLG=1』を置換後ファイルに書き出す。
 (6)発見されたポインタ位置に検索文字列『FLG=0』の長さ +5 を加える。
 (7)(2)へ戻り検索文字列を再検索させる。
 (8)ファイルの最後でないならば(1)へ戻り、EOF ならば終了
・上記が簡単な置換アルゴリズムです。

サンプル:
char *search = "FLG=0"; ←検索前の文字列
char *string = "FLG=1"; ←置換後の文字列

while ( fgets(buff,sizeof(buff),fp) != NULL ){ …(1)
 for ( seek = buff ; (find = strstr(seek,search)) != NULL ; seek = find ){ …(2)
  fprintf( fo, "%.*s", (find - seek), seek ); …(4)
  fputs( string, fo ); …(5)
  find += strlen( search ); …(6)
 }
 if ( find == NULL ){ …(3)
  fputs( seek, fo );
 }
}

解説:
・上記のサンプルの fp、fo がそれぞれ置換前、置換後のファイルポインタを表す。
 『search』が置換前の検索文字列で『string』が置換後の出力文字列になります。
・for 文ブロック内が1行のデータから『search』文字列を探す繰り返しです。
 繰り返す理由としては、1行の中に検索文字列『FLG=0』が複数あった場合に対応するためです。
・fprintf 関数で『%.*s』という見慣れない指定をしていますが、これは (find - seek) の長さ分だけ
 seek 文字列を出力する動作になります。『*』文字は出力精度の指定を引数で行う指示です。
・なお、サンプルの番号(1)~(6)は最初に述べた『簡単な置換アルゴリズム』の番号と一致します。
 両方を対応して仕組みを理解して下さい。
・以上。おわり。→下の『参考URL』もどうぞ。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strstr.html
    • good
    • 2

ファイルから文字列を1行読み込む


読み込んだ文字列の頭から"FLG=0"を探す
  →ポインタを1文字づつ後ろにずらしていってstrcmpなどを使う
見つかったら文字列を書き換える
  →0を1にするだけなら、(ptr+4)の位置に'1'を格納する
文字列1行をファイルに書き出す

ではダメなのですか?
本当は置換の条件が複雑なのでしょうか
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています