アプリ版:「スタンプのみでお礼する」機能のリリースについて

Cでの作成についてなんですが、
fopenでテキストファイルを開き、テキストの中身の
特定文字が含まれている行を新に作ったファイルの中に
書き込みたいんですが、テキストの中身の検索と
抽出方法がいろいろ試してみましたがわかりません。
よろしくお願いします。

A 回答 (3件)

★文字列の検索関数を使えば良い。


・テキストの中身の検索は、行単位で文字列を取得(fgets)してから、この文字列内に
 検索文字列の有無をチェックします。この有無は文字列から文字列を検索する関数
 『strstr』関数を使うのが便利です。また、文字列から1文字の検索を行う場合は
 『strchr』関数を使います。質問では、特定の文字が含まれている行となっていますが
・検索するのは1文字、文字群、文字列のどれですか?
 これによっていろいろと代わりますよ。処理が…。
・とりあえず文字列から特定の文字列を含まれた行を抽出するサンプルを下に載せます。

サンプル:
char buff[ 256 ];
char *find = "検索文字列";
FILE *fp; ←読み込み用
FILE *fo; ←抽出用

省略(fopen×2つ)

while ( fgets(buff,sizeof(buff),fp) != NULL ){
 if ( strstr(buff,find) != NULL ){
  fputs( buff, fo );
 }
}

省略(fclose×2つ)

解説:
・上記のサンプルでは、行単位でテキストの中身を取得して、この文字列から検索文字列(find)が
 含まれるか『strstr()』関数でチェックしています。見つかると『NULL』以外を返します。
・そして、見つかったらば行単位で『fputs』関数で出力しています。
 これで見つかった行だけが、新たに作ったファイルに書き込まれていきます。→抽出です。
・また『strstr()』関数の部分を
 『if ( strchr(buff,'a') != NULL ){ … }』とすると『a』の文字が含まれる行のみを抽出します。
 『if ( strspn(buff,"+-*/") != 0 ){ … }』とすると『+-*/』の文字群が含まれる行のみを抽出します。
 検索する文字とは、1文字、文字群、文字列のどれですか?
・以上。おわり。→上記のを参考にして下さい。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strspn.html,h …
    • good
    • 2
この回答へのお礼

検索するのは文字郡です。
サンプルを参考にさせていただきました。
大変役に立ちました。ありがとうございました。

お礼日時:2007/04/05 01:47

補足要求どおり少し判断材料が足り何のですが、なんとなくわかります。



とりあえずこんなものかと

調べるテキストファイルの中身がこれだったとします。
//read.txt-------
abcdefg
hijklmn
opqrstu
vwxyz
//---------------

int main( void )
{
FILE *fp;
char str1[ 1024 ];
char str2[ 1024 ];
bool bFlag = false; //ファイル内にあったかを判定するフラグ

gets( str1 );

if( (fp = fopen( "read.txt", "r" )) == NULL )
{
printf( "ファイルオープン失敗" );
return -1;
}
else
{
while( 1 )
{
fgets(str2, 1024, fp); //ファイル内から1行読み込み
if( feof(fp) ) break;

for( int i=0; str2[ i ]!='\0'; i++ )
{
for( int j=0; str1[ j ]!='\0'; j++ )
{
if( str1[ j ] == str2[ i ] )
{
bFlag = true;
i++;
}
else
{
bFlag = false;
break;
}
}

if( bFlag == true ) break;
}

if( bFlag == true ) break;
}

fclose( fp );
}

if( bFlag == false )
{
printf( "その文字列はありませんでした。" );
return -2;
}
else
{
printf( "その文字列はありました。" );
if( (fp = fopen( "write.txt", "w" )) == NULL )
{
printf( "ファイルオープン失敗" );
return -1;
}
else
{
fprintf( fp, str2 );

fclose( fp );
}
}

return 0;
}

適当も入っているので参考程度にしてください。
    • good
    • 1
この回答へのお礼

ありがとうございます。
参考にさせていただきます。

お礼日時:2007/04/05 01:45

> テキストの中身の検索と抽出方法がいろいろ試してみましたがわかりません。



具体的にどういう検索と抽出を行いたいのか書かれていませんし、どう「いろいろ試し」たのかもかかれていません。
これでは、アドバイスのしようがないということは、理解できますでしょうか?

1. 具体的にどういう検索と抽出を行いたいのか。
2. 何を試してみたのか。
補足してください。
    • good
    • 0

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