No.1
- 回答日時:
ABCDEFGHIという文字列が入っていることが保証されているのであれば...
#include <cstdio>
int main()
{
std::FILE* stream = std::fopen("file.txt", "rb+");
std::fseek(stream, 4, SEEK_SET);
std::fwrite("++", 1, 2, stream);
}
とすればよいのでは?
ファイル名は仮に file.txt としています。
また、エラーチェックは省略しています。
...と思って投稿しかけたのですが、+は全角ですね。
これだとその部分だけの置き換えでは済まなくなります。
No.3ベストアンサー
- 回答日時:
こんにちは。
テキストファイル内の"EF"を全て"++"に置換するという解釈でサンプルを
作ってみました。(C++で作成してあります。)
宜しければ試してみて下さい。
※ご使用の環境でビルド&実行が上手くいかなかった場合はすみません。
入力&出力ファイルは固定のファイル名としています。
・入力ファイル名: "test.txt"
・一時ファイル名: "temp.txt" (置換後のテキストを一時保存するファイル)
・BAKファイル名: "test.bak" (置換した場合のバックアップファイル)
■サンプルプログラム
注)インデントのため全角スペースを入れています。
コピペの際は半角スペースorタブに置換して下さい。
/////↓ここから///////////////
/*
* テキストファイル上の文字列置換(サンプル)
*/
#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include <errno.h>
using namespace std;
int main()
{
int line; //行カウンタ
int rcnt; //置換カウンタ
int ferr; //ファイルエラーフラグ
char sLine[256]; //1行読込みバッファ
ifstream finp; //入力ファイルストリーム
ofstream fout; //出力ファイルストリーム
string strWk1; //文字列ワーク
string strWk2; //文字列ワーク
string strWk3; //文字列ワーク
string::size_type idx; //文字位置インデックス
//== ファイル名
const char szInpFn[] = { "test.txt" }; //入力ファイル
const char szTmpFn[] = { "temp.txt" }; //一時ファイル
const char szBakFn[] = { "test.bak" }; //BAKファイル
//== 入力ファイルオープン
finp.open( szInpFn );
if( !finp ){
cout << "Cannot open file. (inp)" << endl;
return 1;
}
//== 一時ファイルオープン
fout.open( szTmpFn );
if( !fout ){
cout << "Cannot open file. (tmp)" << endl;
finp.close();
return 1;
}
//== 文字列置換しながらファイルをコピー
line = 0; //行カウンタクリア
rcnt = 0; //置換カウンタクリア
ferr = 0; //ファイルエラーフラグクリア
do {
//入力ファイルより1行読込み
finp.getline( sLine, sizeof(sLine) );
if( !finp.eof() && (finp.bad() || finp.fail()) ){
//エラーなら読込み終了
ferr = 1; //ファイルエラーフラグON
break;
}
if( finp.eof() ) break; //EOFなら読込み終了
//文字列置換
strWk1 = sLine; //入力文字列
strWk2 = "EF"; //検索文字列
strWk3 = "++"; //置換文字列
do { //1行分の全置換
idx = strWk1.find( strWk2 ); //検索
if( idx == string::npos ) break; //なければループ脱出
strWk1.replace( idx, strWk2.size(), strWk3 ); //置換
rcnt++; //置換カウンタUP
} while(1);
//一時ファイルに1行書込み(置換後の文字列)
fout << strWk1 << "\n";
line++; //行カウンタUP
//==debug
cout << "line no\t: " << line << endl;
cout << "inp str\t: " << sLine << endl;
cout << "out str\t: " << strWk1 << endl;
//==debug
} while(1);
//==debug
cout << "total lines\t: " << line << endl;
cout << "replace count\t: " << rcnt << endl;
//==debug
//== ファイルクローズ
finp.close();
fout.close();
//== ファイルエラーなら終了
if( ferr ){
cout << "file read error. (inp)" << endl;
return 2;
}
//== 置換無しなら一時ファイルを削除して終了
if( rcnt < 1 ){
remove( szTmpFn );
return 0;
}
//== ファイル名変更(1):入力ファイル⇒BAKファイル
if( remove( szBakFn ) == -1 ){ //既存のBAKファイルを削除
if( errno == EACCES ){ //読出し専用だったらエラーで終了
cout << "file remove error. (bak)" << endl;
return 3;
}
}
if( rename( szInpFn, szBakFn ) != 0 ){ //リネーム(入力⇒BAK)
cout << "file rename error. (inp -> bak)" << endl;
return 4;
}
//== ファイル名変更(2):一時ファイル⇒入力ファイル
if( rename( szTmpFn, szInpFn ) != 0 ){ //リネーム(一時⇒入力)
cout << "file rename error. (tmp -> inp)" << endl;
return 4;
}
return 0;
}
/////↑ここまで///////////////
<入力ファイル:置換前>
ABCDEFGHI-EF-
EF012ABCDEF
ABCDEF0123
0123456789
<実行結果>
line no : 1
inp str : ABCDEFGHI-EF-
out str : ABCD++GHI-++-
line no : 2
inp str : EF012ABCDEF
out str : ++012ABCD++
line no : 3
inp str : ABCDEF0123
out str : ABCD++0123
line no : 4
inp str : 0123456789
out str : 0123456789
total lines : 4
replace count : 5
<入力ファイル:置換後>
ABCD++GHI-++-
++012ABCD++
ABCD++0123
0123456789
以上です。参考になれば幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- HTML・CSS HTMLエディタBracketsの文字化け 3 2022/04/28 14:50
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- フリーソフト フォルダ、ファイル名の一括変換について 3 2023/03/16 09:23
- Visual Basic(VBA) Excel VBA 教えてください。 VBA初心者です。 詳しい方がいましたら教えてください。 下記 3 2023/04/25 11:22
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- ドライブ・ストレージ Windows10でのファイル内の文字列検索 SSDに寿命? 4 2022/07/12 03:25
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- HTML・CSS docxをmht形式で保存したファイルをedgeで開くと文字化けする 1 2022/07/29 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GoogleAppsScript文字列置換の...
-
VBA 置換文字がみつからない時
-
正規表現 特定の文字列を含む行...
-
csvデータ ダブルクォーテ...
-
PowerShellでテキストの空白行...
-
スペースで区切られた氏名から...
-
Perl での XML 置換について
-
ExcelVBA バッチファイル編集
-
VBA(Excel)でファイル内の文字...
-
c# ビルド直前にコードを置換で...
-
\\(円)記号を置換したい
-
TeraPadエディターの操作方法に...
-
正規表現で一括置換
-
Excel・ユーザーフォームの情報...
-
C#で空白行を削除する方法
-
特定の列のみ置換を行いたい
-
SQL IIF と REPLACE のやりかた
-
Eclipse 改行後のタブ
-
フォントの色を保持したままセ...
-
正規表現で、特定の文字列を含...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
各項目がダブルクォーテーショ...
-
VBA 置換文字がみつからない時
-
正規表現で、特定の文字列を含...
-
スペースで区切られた氏名から...
-
csvデータのダブルクォーテーシ...
-
csvデータ ダブルクォーテ...
-
GoogleAppsScript文字列置換の...
-
C言語でテキストファイルの内容...
-
正規表現 特定の文字列を含む行...
-
テキストボックスの文字列を置...
-
EXCEL警告「置換対象のデータが...
-
TeraPadエディターの操作方法に...
-
xmlファイル内の文字列置換
-
python 大文字小文字を区別しな...
-
C#で空白行を削除する方法
-
テキストファイル中の文字列の置換
-
Excel VBA 教えてください。 VB...
-
ハングルを日本語に置換
-
EXCEL VBA でCTRL+Fのダイア...
-
PowerShellでテキストの空白行...
おすすめ情報