• 締切済み

ファイル内の文字列を検索して該当行を置換するには?

C++にて"test.txt"内を検索して"No=00000"という行を"No=12345"に書き換えてファイルを上書き、 という処理をするプログラムを作成したいのですが、どのようにファイルへ書き込みをすればよいのか が分かりません"No=00000"の行を置換するまではできたのですが、置換した文字列で元の文字列を上書きするには どうすれば良いのでしょうか? それとも以下のソースでは根本的に考え方が違うのでしょうか?初歩的な質問で恐縮ですが、よろしく お願い致します。 *************************************** //test.cpp #include <string> #include <fstream.h> void main() { fstream fs; char buf[512]; fs.open("test.txt",ios::in | ios::out); while(!fs.eof()) { fs.getline(buf,sizeof(buf)); if(strstr(buf, "No=")) { std::string aa; aa=buf; aa.replace(3,5,"12345"); //ここからの処理が分かりません・・・ } } } ************************** test.txtは以下の通り Name=test No=00000 ←この行だけ書き換えたい。 Address=hoge

みんなの回答

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.2

1.読み込みファイルを開く(test.txt) 2.書き込みファイルを開く(test.tmp) 3.前述 4.ファイルを閉じる 5.読み込みファイルを開く(test.tmp) 6.書き込みファイルを開く(test.txt) 7.読み込み→書き込み 8.ファイルを閉じる 9.test.tmpを削除する

全文を見る
すると、全ての回答が全文表示されます。
  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

1.一行読む 2a.該当行なら新しい行を書き込む 2b.非該当行ならそのまま書き込む 3.EOFまで(全部読み終わるまで)繰り返す ではだめですか?

komainusi
質問者

お礼

レスありがとうございます。ご教授いただいた方法でも全然問題ないです。 試しに、以下のようにしてみたのですが、ファイルへは何も書き込まれませんでした。何が悪いのでしょうか? 根本的な考え方が違うならば、ご指摘ください。 具体的にコードを示して頂けるとありがたいです。 while(!fs.eof()) { fs.getline(buf,sizeof(buf)); if(strstr(buf, "No=")) { fs.write("No=12345",sizeof(buf)); } }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【c++】文字列の操作

    お世話になります。 テキストの操作について質問があります。 getline関数を使用してテキストの1行分を読み込み その文字列をstrtok関数を使用し区切り文字ごとに配列に入れたいと考えています。 ですがgetlineはstd::string型の変数が必要でstrtok関数はchar型しか受け付けないため 関数同士で型が合わず困っています。 何とか型を合わせる方法は無いでしょうか。 以下にソースコードを記載しますのでご指導お願いします。 int main(){ using namespace std; string strText; char chArray[100]; ifstream fs("test.txt"); //パスで指定されたファイルから1行分の文字列を取得する while( getline(fs , strText , '\n') ){ //区切りごと配列に入れたい chArray = strtok(strText , ","); } }

  • テキストファイルを読み込み 偶数行の特定の文字を置換するには?

    お世話になります。 vb6なんですけどテキストファイルを読み込んで 偶数行のある文字を置換したいんですけど このサンプルをどういう風に改変して偶数行の文字列をある文字列に 置換するコードを書いてよいのかわかりません。 置換するのはreplace関数を使うと思うのですが。 教えて下さい。お願いします。 Dim n As Long, tmp As String n = FreeFile Open "D:\Test.txt" For Input As #n Line Input #n, tmp Close #n

  • UNIX のシェル 文字の置換について

    シェルでファイルの文字列を置換したいです。 /*~*/のコメントの文字なので、1行数を変えたくないです。 ─────────────────────────── ※1文字分の空白を「_」で表示します。 test.txtファイルの「XXXXX」を「aa___」に置換する。 ─────────────────────────── 【test.txt 置換前】 /**************/ /*_XXXXXYYYYY_*/ /**************/ 【シェルの内容 test.sh】 #!/bin/csh set IN_henkan = `printf "%-5s" $1` perl -i -p -e 's/XXX/'$IN_henkan'/g' test.txt 【シェルを実行】 test.sh aa 【test.txt置換前 希望する状態】 /**************/ /*_aa___YYYYY_*/ /**************/ 【test.txt置換前 実際の状態】 /**************/ /*_aa_YYYYY_*/ /**************/ ─────────────────────────── 「aa」の後ろに1文字分の空白しか挿入されないです。

  • 文字列の置換

    電話番号のデータを文字列分、'#'で置換したいのですが、 update test set tel_no = replace(tel_no,tel_no,'#'); では、'#'一文字になってしまいます。 電話番号が10桁の場合、##########と置換するための OracleのSQLを教えてください。

  • 文字列の置換について

    こんにちは、kanpoと申します。 今回文字列の置換についての質問をさせていただきたいと思います。 やりたいことは以下のとおりです。 たとえば、あるStringデータに”あかさた#1728なはま#7586やらわ”などという 文字列が入ってるとします。 この文字列のなかから"#1728"と"#7586"を検索しそれぞれを #1728 → test #7586 → test2 と変換し最終的にもとのStringデータを ”あかさたtestなはまtest2やらわ”としたいのです。 説明が長くなってしまい申し訳ありませんがよろしくご教授ください。 環境は下記のとおりです。 RedhatLinux6.2J apache-1.3.12-0jp1.i386 php-3.0.15_i18n_ja-0vl2.i386

    • ベストアンサー
    • PHP
  • 文字列を引数にしたがって置換するプログラムを作りました。

    文字列を引数にしたがって置換するプログラムを作りました。 test.txtを新規作成、abcdefghijklmnopqrstuvwxyz を書き込みセーブ 引数 : abc=zz mnopq=u - 出力結果 - zzdefghijklurstuvwxyz というような結果になるプログラムを作ったのですが、これをstr系とmem系の関数を使わずにポインタを使って組みなおしたいと思うのですが、全くわからないので質問させて頂きました。 よろしくお願いします。 質問下手なので質問でダメな点があれば随時補足していきたいと思います。 #include"stdafx.h" #include<stdio.h> #include<string.h> #include<stdlib.h> #define BUF 128 #define MOJI 128 #define MAX 128 #pragma warning(disable : 4996) using namespace System; int main(int argc, char *argv[]) { FILE *fp; char txt[BUF]; char hiki_mae[MAX][MOJI]; char hiki_ato[MAX][MOJI]; int i = 0, n = 0, j = 0; int hiki_num = 0; char txt_mae[BUF], txt_ato[BUF]; char *p; char sagyou_txt[BUF], sagyou_argv[MAX][MOJI]; if(argc < 2){ printf("argc = %d >>> パラメータ不足です\n", argc); exit(1); } if( (fp = fopen("test.txt", "r")) == NULL ){ printf("ファイルがオープンできません\n"); exit(1); } for(i = 1; i < argc; i++){ if( strchr(argv[i], '=') != NULL && strlen(argv[i]) > 2){ strcpy(sagyou_argv[hiki_num],argv[i]); p = strstr(sagyou_argv[hiki_num],"="); *p = '\0'; strcpy(hiki_mae[hiki_num], sagyou_argv[hiki_num]); strcpy(hiki_ato[hiki_num], sagyou_argv[hiki_num] + strlen(hiki_mae[hiki_num]) + 1); hiki_num++; } } while( fgets(txt, BUF, fp) != NULL){ printf("変換前>%s\n",txt); } for(n = 0; n < hiki_num; n++){ while( strstr(txt, hiki_mae[n]) != NULL ){ strcpy(sagyou_txt, txt); p = strstr(sagyou_txt, hiki_mae[n]); *p = '\0'; strcpy(txt_mae, sagyou_txt); strcpy(txt_ato, sagyou_txt + strlen(txt_mae) + strlen(hiki_mae[n])); strcat(txt_mae, hiki_ato[n]); strcat(txt_mae, txt_ato); strcpy(txt, txt_mae); } } printf("変換後>%s\n",txt); fclose(fp); return 0; }

  • 続jファイルに文字列を書く

    あれから後一歩と言うところにきました たぶんmallocのバグだと思いますがチャットのシステムを作ろうとしているのですが 読み込み時にエラーになります ソースの注目部分を見てほしいのですが、 注目部分はbuf+1 にすると 文字列が1文字ずつ消えていくバグになり bufにすると 3行目を書き込んだ時点で3行目がの頭の部分の文字列がおかしくなり4行目を書き込もうとするとエラーになります ちゃんと動作するにはどのように書けば良いですか? ---ソース--- #include <stdio.h> void main(void){ FILE *fp; char *tm[1000]; char buf[400]; int i=1,sei; fp= fopen("now.txt","w+"); fprintf(fp,"もも"); fclose(fp); //何で最初に書き込んでるんだ? //という突っ込みがあるでしょうが本当に作りたいプログラムは最初にファイルに書き込まないといけないためです。 fp= fopen("now.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[0]=(char*)malloc(strlen(buf)+1); strcpy(tm[0], buf); } fclose(fp); fp =fopen("moto.txt","r"); while( fgets( buf, 400, fp ) != NULL ){ tm[i] = (char*)malloc(strlen(buf+1)); strcpy(tm[i], buf+1); //ここを注目 if(i<999){ i++; } } fclose(fp); if(i<=1000){ sei=i; } else{ sei=1000; } fp =fopen("moto.txt","w"); for(i=0;i<sei;i++){ if(i==0){ fprintf(fp,"%s\n",tm[0]); } else{ fprintf(fp,"%s",tm[i]); } } } ---now.txt--- もも ---moto.txt--- オレンジ みかん

  • PHPソースファイルの文字列置換をしてから、

    PHPソースファイルの文字列置換をしてから、 そのスクリプトを実行する方法を実行しようとしている のですが、うまくいきません。 似たような質問(http://oshiete.nikkeibp.co.jp/qa5496696.html) を参考にして、文字列置換自体はうまくいったのですが、 phpファイル実行時にまったく関係の無いはずの DBアクセスでエラーが発生してしまいました。 変換前前のphpファイルに置換後の文字列を手で入れて、 データベース実行するとうまくいきます。 しかしながら、phpファイルの文字列置換をstr_replaceで実行し、別名保存した後 includeしても、うまくいかないといった状況です。 ちなみに置換後のphpファイル内で $置換後文字列 = "test"; echo $置換前文字列; とすると、置換前文字列が置換後文字列に きちんと変わっているようで、 "test"と出力されます。 もしかすると、原因は違う所に潜んでいるのかもしれませんが、 どこを調べれば良いのか検討がつかず困っております。 どなたか解決手段の分かる方がいらっしゃれば教えて頂けませんでしょうか? -------------------------------------------------------------- 尚、ファイル構成は top |-change (1.php) |-database (2.php) |-search (検索画面[データベース検索の入り口。form action ="./3.php"],3.php) |-base (4.php,5.php[tempファイル]) となっており、 それぞれの中身は 1.文字列置換実行用のphpファイル(1.php):  1-1.file_get_contentsで4のphpファイルを取得  1-2.str_replaceを用いて文字列置換  1-3.文字列置換したファイルをfwriteで4.phpと同じディレクトリに保存(5.php)  1-4.5.phpをincludeする。  1-5.5.phpをunlinkする。 2.データベースアクセス(mysql)用関数を含むphpファイル(2.php):  ↓エラーの原因と思われる関数  function connect() { global $host,$user_id,$passwd,$con; $con = mysql_connect($host,$user_id,$passwd); } 置換前phpファイルを手動で文字列置換した場合には  同ファイル内で設定したglobal変数の値がきちんと格納されており、  データベース実行がうまくいきます。  置換後phpファイルでは$host等に値が格納されていないため、  データベース実行がうまくいきません。  グローバル変数の中身は同ファイル内で定義しています。 3.検索を実行した時に呼び出されるphpファイル(3.php):  3-1.include("../change/1.php"); 3-2.1.phpの関数の実行 4.文字列置換前のphpファイル(4.php): /*呼び出し元のディレクトリ位置でないとincludeに失敗する*/ 4-1.include("../database/2.php");  4-2.2.phpのデータベースアクセス関数を実行する。 5.文字列置換後のphpファイル(5.php): 3-2の1.php関数の実行により、一時的に生成される。

    • ベストアンサー
    • PHP
  • 複数行に渡る文字列の置換

    こんにちは、Perl初心者です(プログラミング全般の初心者です)。 カレントフォルダ内のテキストファイルに対して、文字列置換をするスクリプトを書こうとしています。具体的には、以下のようにストリングIDの直下に改行のみの場合(ストリングがない)は、[BLANK]という文字列を挿入したいと思っています。 TEXT_STRING_ID_001<改行> <改行> <改行> TEXT_STRING_ID_002<改行> 入門書やこのサイトの皆さまのお力を借りて、なんとか以下のようなリストを書きエラーなく置換処理ができるところまでは確認できました。 しかし、この方法だと結局1行ずつ処理していることになるので、「s/\n{3}/\n[en]\n/gm」のような置換ができません(mオプションをつけてもダメなようです)。 この問題を解決する良い方法はないものでしょうか。 (もしかすると、処理の仕方を根本から変えないといけないのでしょうか) 以下、現状のリスト: use strict; use warnings; my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); print $dir, "\n"; open(FILE, $dir) or die "$dir: $!"; my @file = <FILE>; close(FILE); foreach my $line (@file) { $line =~ s/\n{3}/\n[BLANK]\n/gm; } open(NEWFILE, "> $dir") or die "$dir: $!"; print NEWFILE @file; close(NEWFILE); } closedir(DIR);

    • ベストアンサー
    • Perl
  • perlで特定行から特定行までを抜き出しor置換

    perlで以下のようなことをしたいと考えています。 以下のことを、コマンドラインから「perl ~」という形で 実行したいのですが、どのよにすればよいでしょうか。 1.特定行から特定行までを抜き出し 2.特定行から特定行の範囲で文字列置換 例えば、次のようなテキストファイルがあったとします。 example.txt ================================== #START aaaa hogehoge test okok perl script #END ================================== 上記ファイルを読み込んで、 1.「#START」から「#END」の間に挟まれた行だけ抜き出し 2.「#START」から「#END」の間で、「test」を置換 のです。 sedで言うところの sed -e '/#START/,/#END/ s/YYYYMM/201603/g' test.txt をやりたいのです。

    • ベストアンサー
    • Perl
このQ&Aのポイント
  • 彼氏以外の男性との食事にモヤモヤしてる男性の悩み
  • 彼女が理由を話しているものの、相談者は信用できない状態
  • 胸が痛い思いを抱える相談者、男としての役割はどうあるべきか
回答を見る

専門家に質問してみよう