C言語関係掲示板

過去ログ

No.1336 ファイル中の単語の削除

[戻る] [ホームページ]
No.17990

ファイルの編集
投稿者---素人(2004/11/11 18:31:46)


C言語でファイルの編集をする処理ですが、下記のように
1.あるファイルを更新モードで開く。
2.そのファイルの中にある単語と一致した場合、その文字列を削除する。
3.ファイルを閉じる。
という処理をやるわけですが、私の案では、
1.あるファイルを更新モードで開く。
2.テンポラリファイルを開く。
3.あるファイルの中にある単語と一致した文字列以外の文字列を全てテンポラリファイルに書き込む。
4.テンポラリファイルを閉じる。
5.あるファイルを閉じる。
6.テンポラリファイルをあるファイルにコピー(上書き)する。
という順ですが、これは手間がかかるそうなので簡単な方法はないでしょうか?
ご教授宜しくお願い申し上げます。



No.17991

Re:ファイルの編集
投稿者---秘密(2004/11/11 18:40:34)


簡単かどうかはわかりませんが、

1.ファイルのサイズを得る
2.手順1で得たサイズを基に配列を確保する
3.ファイルを開く
4.ファイルの内容を配列に読み込む
5.ファイルを閉じる
5.ある単語と一致した文字列を削除する
6.ファイルを開く
7.配列の内容をファイルに書き込む
8.ファイルを閉じる
9.手順2で確保した配列を解放する

はどうでしょうか。

>C言語でファイルの編集をする処理ですが、下記のように
>1.あるファイルを更新モードで開く。
>2.そのファイルの中にある単語と一致した場合、その文字列を削除する。
>3.ファイルを閉じる。
>という処理をやるわけですが、私の案では、
>1.あるファイルを更新モードで開く。
>2.テンポラリファイルを開く。
>3.あるファイルの中にある単語と一致した文字列以外の文字列を全てテンポラリファイルに書き込む。
>4.テンポラリファイルを閉じる。
>5.あるファイルを閉じる。
>6.テンポラリファイルをあるファイルにコピー(上書き)する。
>という順ですが、これは手間がかかるそうなので簡単な方法はないでしょうか?
>ご教授宜しくお願い申し上げます。




No.17998

Re:ファイルの編集
投稿者---素人(2004/11/11 19:25:00)


ご回答ありがとうございます。
私の知識では難しいです。
1の手順ですが、ファイルを開く前にファイルのサイズを得ることが可能ですか?
私の場合は開かないと得ることは出来ないので。
下記のように作ってみましたが、、、
あと、2の手順で配列を確保するってのはcalloc?それともmalloc?

FILE *fp ;
size_t size ;

if( fp = fopen( "test.txt", "w" ) ) {
  fseek( fp, 0L, SEEK_END ) ;
  size = ftell( fp ) ;
  fseek( fp, 0L, SEEK_SET ) ;
   :
   :

  fclose( fp ) ;
  return( 0 ) ;
}
宜しくお願いします。


>簡単かどうかはわかりませんが、
>
>1.ファイルのサイズを得る
>2.手順1で得たサイズを基に配列を確保する
>3.ファイルを開く
>4.ファイルの内容を配列に読み込む
>5.ファイルを閉じる
>5.ある単語と一致した文字列を削除する
>6.ファイルを開く
>7.配列の内容をファイルに書き込む
>8.ファイルを閉じる
>9.手順2で確保した配列を解放する
>
>はどうでしょうか。
>
>>C言語でファイルの編集をする処理ですが、下記のように
>>1.あるファイルを更新モードで開く。
>>2.そのファイルの中にある単語と一致した場合、その文字列を削除する。
>>3.ファイルを閉じる。
>>という処理をやるわけですが、私の案では、
>>1.あるファイルを更新モードで開く。
>>2.テンポラリファイルを開く。
>>3.あるファイルの中にある単語と一致した文字列以外の文字列を全てテンポラリファイルに書き込む。
>>4.テンポラリファイルを閉じる。
>>5.あるファイルを閉じる。
>>6.テンポラリファイルをあるファイルにコピー(上書き)する。
>>という順ですが、これは手間がかかるそうなので簡単な方法はないでしょうか?
>>ご教授宜しくお願い申し上げます。
>




No.18148

Re:ファイルの編集
投稿者---wa(2004/11/16 00:31:32)


>私の知識では難しいです。
>1の手順ですが、ファイルを開く前にファイルのサイズを得ることが可能ですか?

fstat関数

>私の場合は開かないと得ることは出来ないので。
>下記のように作ってみましたが、、、
>あと、2の手順で配列を確保するってのはcalloc?それともmalloc?

calloc関数:メモリ確保(0初期化)
malloc関数:メモリ確保(データ不定)
realloc関数:メモリ確保(確保を拡大?)




No.18149

Re:ファイルの編集
投稿者---YuO(2004/11/16 01:58:36)


>1の手順ですが、ファイルを開く前にファイルのサイズを得ることが可能ですか?

まず,開く前に得ることは,処理系によっては出来るかもしれませんが,
標準Cの範囲内では不可能です。

次に,開いたあとであっても,fgetc等で読み進む以外の方法で,
ファイルのサイズ(というか,読み込み可能な文字数)を得ることは,
可搬性のある方法では不可能です。

テキストストリーム相手のftellは,
あくまで現在のファイル指示子を保持するための値以上の意味をもたないですし,
#ファイルの先頭からの位置を返すのではないことに注意(それを返してもよい)。
バイナリストリームではfseekの第三引数にSEEK_ENDを指定した場合,
有意な動作をする必要はないとされています。


>あと、2の手順で配列を確保するってのはcalloc?それともmalloc?

基本的に,callocを使う場面はほとんどありません。
本当に全てのビットが0で埋まっていて欲しい場面でのみ使えます。
#つまり,整数または整数のみからなる構造体,及びそれらの配列相手のみ使える。