掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28204

ファイル内の指定文字列〜指定文字列の「〜」をコピー
投稿者---かずな(2006/09/18 16:12:40)


始めまして。C言語を始めて3ヶ月の初心者です。
ある、テキストファイル内の指定文字列〜指定文字列の「〜」をコピーして、
そのテキストファイルに、コピーした文字列を上書きしたいのですが、どうしたらよろしいでしょうか?
---------------------------
あかさたなはまやらわん
abc あいうえお
かきくけこ
さしすせそ xyz
いきしちにひみいりい
-------------------------

とテキストファイルがあった場合に、
「abc」を先頭文字列
「xyz」を終了文字列 として、

「abc あいうえお
かきくけこ
さしすせそ xyz」

と、文字列をコピーして、元のファイルに上書きしたいです。


1.ファイルオープン
2.検索「abc」
3.「xyz」まで文字列をバッファにコピーする
4.バッファーの文字をファイルに上書きする
5.ファイルクローズ

と、組み立てて考えてみましたが、まだ、ポインタだの、ファイル入出力への知識が乏しく、エラーや綺麗なプログラムがかけません。
ポインタ、ファイル入出力は、今後の自分への課題にもなりますのでご指導お願いいたします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイル内の指定文字列〜指定文字列の「〜」をコピー 28205 Blue 2006/09/18 17:06:19
<子記事> Re:ファイル内の指定文字列〜指定文字列の「〜」をコピー 28210 shu 2006/09/18 22:21:31
<子記事> Re:ファイル内の指定文字列〜指定文字列の「〜」をコピー 28220 iijima 2006/09/20 11:44:24


No.28205

Re:ファイル内の指定文字列〜指定文字列の「〜」をコピー
投稿者---Blue(2006/09/18 17:06:19)


とりあえず、テキストファイルの置換は1回のオープンではできません。
置き換え部分の読み込み用のオープンと、書き込み用のオープンで2回に分けないといけません。

それと、簡単にオープンして検索するのは難しいので
1行ごと読み込み、指定文字があるかどうかチェックしていくのが普通でしょう。(fgets,strstr,strcpyあたりを使ってください。)

とりあえず、できるところまでコードを書いてみてください。
で、具体的にわからないところはコメントかなんかにして再度質問してください。
(コードを載せる際は、HTML変換ツールを使ってください。
また、開発環境は必ず明記してください。)


この投稿にコメントする

削除パスワード

No.28208

Re:ファイル内の指定文字列〜指定文字列の「〜」をコピー
投稿者---かずな(2006/09/18 19:11:13)


>とりあえず、テキストファイルの置換は1回のオープンではできません。
>置き換え部分の読み込み用のオープンと、書き込み用のオープンで2回に分けないといけません。
あ、1回ではできないのですね。

>それと、簡単にオープンして検索するのは難しいので
>1行ごと読み込み、指定文字があるかどうかチェックしていくのが普通でしょう。(fgets,strstr,strcpyあたりを使ってください。)
fget,strcpyあたりだと使用したことあるので考え直してみます。

>とりあえず、できるところまでコードを書いてみてください。
>で、具体的にわからないところはコメントかなんかにして再度質問してください。
簡易アクセスカウンタを作るだけで3日かかったので、すぐには作成できませんが、がんばってみます!
ヒントありがとうございました。



この投稿にコメントする

削除パスワード

No.28210

Re:ファイル内の指定文字列〜指定文字列の「〜」をコピー
投稿者---shu(2006/09/18 22:21:31)


//
//	大雑把なプログラムの流れ(shuの場合)
//

{
    //	fopenなど
    
    //	前半:abcが見つかるまで
    while (fgets(buf, sizeof(buf), fp) != NULL) {
        if (/* abcが見つかった */) {
            break;
        }
    }
    fputs(buf, fp2);	//	abcが見つかった行
    
    //	後半:xyzが見つかるまで
    while (fgets(buf, sizeof(buf), fp) != NULL) {
        fputs(buf, fp2);
        
        if (/* xyzが見つかった */) {
            break;
        }
    }
    
    //	入力ファイルを削除
    //	出力ファイルを入力ファイル名に改名
    //	など
}



この投稿にコメントする

削除パスワード

No.28211

Re:ファイル内の指定文字列〜指定文字列の「〜」をコピー
投稿者---Blue(2006/09/18 22:57:13)


仕様が明確ではありませんけど、
同一行に abc と xyz がある場合はどうしましょう?


この投稿にコメントする

削除パスワード

No.28216

Re:ファイル内の指定文字列〜指定文字列の「〜」をコピー
投稿者---shu(2006/09/19 10:48:51)


//
//	同じ行にabcとxyzがある場合も考えて……
//

//	後半をdo~whileにする
{
    //	前半:abcが見つかるまで
    while (fgets(buf, sizeof(buf), fp) != NULL) {
        if (/* abcが見つかった */) {
            break;
        }
    }
    
    //	後半:xyzが見つかるまで
    do {
        fputs(buf, fp2);
        
        if (/* xyzが見つかった */) {
            break;
        }
    } while (fgets(buf, sizeof(buf), fp) != NULL);
}

//	フラグを使う
{
    //
    while (fgets(buf, sizeof(buf), fp) != NULL) {
        if (flag == 0) {
            if (/* abcが見つかった */) {
                flag = 1;
            }
        }
        else {
            fputs(buf, fp2);
            
            if (/* xyzが見つかった */) {
                break;
            }
        }
    }
}

//	xyzが見つからなかった場合のみ後半を実行
{
    //	前半:abcが見つかるまで
    while (fgets(buf, sizeof(buf), fp) != NULL) {
        if (/* abcが見つかった */) {
            break;
        }
    }
    fputs(buf, fp2);
    
    if (/* xyzが見つからなかった */) {
        //	後半:xyzが見つかるまで
        while (fgets(buf, sizeof(buf), fp) != NULL) {
            if (/* xyzが見つかった */) {
                break;
            }
        }
    }
}

//	gotoを使って後半をとばす
{
    //	前半:abcが見つかるまで
    while (fgets(buf, sizeof(buf), fp) != NULL) {
        if (/* abcが見つかった */) {
            break;
        }
    }
    fputs(buf, fp2);
    
    if (/* xyzが見つかった */) {
        goto XYZ;
    }
    
    //	後半:xyzが見つかるまで
    while (fgets(buf, sizeof(buf), fp) != NULL) {
        if (/* xyzが見つかった */) {
            break;
        }
    }
XYZ:
}



この投稿にコメントする

削除パスワード

No.28220

Re:ファイル内の指定文字列〜指定文字列の「〜」をコピー
投稿者---iijima(2006/09/20 11:44:24)


別解:1文字ずつ読み込む方法の例です。

出力文字列用のバッファを用意する。
出力フラグを0(出力しない)で初期化する。

1.ファイルから1文字読み込み、chに代入する(ファイル末尾に達していたら3.へ)。

2-1.フラグが0(出力しない)のとき
(1) chが'a'に等しければ、ファイルから次の2文字を読み込み、
    aから始まる3文字が"abc"に等しければ、
    ・その3文字をバッファに追加する。
    ・フラグを1(出力する)に変更する。
    ("abc"に等しくなければなにもしない)
(2) 1.に戻る。

2-2.フラグが1(出力する)のとき
(1) ch(1文字)をバッファに追加する。
(2) chが'x'に等しければ、ファイルから次の2文字を読み込み、
    ・その2文字をバッファに追加する。
    ・xから始まる3文字が"xyz"に等しければ、フラグを0(出力しない)に変更する。
    ※「abc〜xyz」1回分しか出力しないという仕様ならば3.へ。
(3) 1.に戻る。

3.バッファ内の文字列をファイルに出力する。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧