この人頭いいなと思ったエピソード

こんにちは。今、プログラム書いてるんですけど目的としては、
1、テキストファイルから文字列を読み込む。(大体数万文字)
2、それを100個ずつに区切る。
3、その百個ずつを二文字ずつ読んでいって、それがgcという文字列ならばその
百個の中での割合を示す。
4、さらに次の百個を・・・・
みたいなプログラムを書いてるんですけど一応下のような形までこぎつけましたが
もう、お手上げです。
どなたか、助けてください。

#include<iostream.h>
#include<stdio.h>
#include<string.h>
int main()
{
char pch[3];
int count=0;
FILE *fin;


fin=fopen('C:\ahowaki.dat','r');
fscanf(fin,'%s',&pch);

cout<<"入力\n";


while(pch){
cin.read(pch,2);

if((strcmp(pch,"gc"))==0)
count++;


if(count>=0 && count<=25)
cout<<"Under25%\n";
if(count>=26&& count<=50)
cout<<"Under50\n";
if(count>=51&& count<=75)
cout<<"Under75%\n";
if(count>=76&& count<=100)
cout<<"Under99%\n";

else
cout<<"Over100%\n";
}


return 0;


fclose(fin);
}

A 回答 (2件)

こんにちは。

itohhといいます。

前回の質問はこういうことだったのですね。

ちょっと、確認しますが、
1.C:\ahowaki.datファイルを読み込み、以下の処理を行いたい。
2.100バイトごとに特定の文字列の出現回数を採りたい。

これを前提にサンプルを書きます。
(インデントするために先頭に全角スペースを入れています)

int main()
{
  FILE *fin;
  char pch[101];
  int numread=0;
  int count=0;
  int i=0;

  if( (fin = fopen( "C:\\ahowaki.dat", "r+t" )) != NULL )
  {
    do
    {
      memset( pch, 0x00, sizeof(pch));
      /* 100文字を読み込む */
      numread = fread( pch, sizeof( char ), 100, fin );

      count = fncCheck(pch, "gc");

      printf( "%d:%d\n",i, count );
      i++;
    }
    while(numread==100);

    fclose( fin );
}

  return 0;
}

int fncCheck(char *pch, char *item)
{
  int count=0;
  int i=0;

  /* 文字列の最後まで検索する */
  for( i=0; i<stelen(pch); i++)
  {
    /*一致した場合は、カウントする*/
    if(memcomp(&pch[i], item, 2) == 0)
    {
      count++;
    }
  }

  return count;
}

テストしていないのでコンパイルエラー&バグがあるかもしれません。
    • good
    • 0
この回答へのお礼

こんにちは。そうです、実はこれが目的だったんです。本当に毎回的確なご回答ありがとうございます。
なんか、itohhさんにはお世話になりっぱなしで、なんとお礼をいったら良いのか分からないぐらいです。今回のプログラムを元に(といっても、90%これと同じですが・・・・♪)自分なりに書いてみることができました。エラーとかも自力で取り除くことができました。なんかちょっと自信つきました。本当にありがとうございます。
それにしてもプログラムって難しいですね。これほどのものをすぐかけるってすごいですね。僕も頑張ってもっと勉強したいと思います。
同じ目的でもプログラムっていろんな書き方があるんですね。あるごりずむってやつですか?僕もアルゴリズム本格的に勉強してみたくなりました!!!!!!!
本当にありがとうございました!!!!!

お礼日時:2001/11/25 01:13

たとえば、こんな感じでしょうか?


バグもあるかも。
これだと、100文字目が g で、101文字目が c の場合も
カウントされると思います。これじゃまずいなら、
変数の初期化のところで、flg も初期化してください。

#include <stdio.h>
#include <string.h>

void showResult( int gccnt, int cnt );

int main()
{
 /* filename は C:\ahowaki.dat みたいですが... */
 FILE *fl = fopen( "filename", "r" );
 /* ファイルから読み込んだ1文字 */
 int c;
 /* ファイルから読み込んだ文字数(100までいくと初期化される) */
 int cnt = 0;
 /* 'gc'の数(cntが100までいくと初期化される) */
 int gccnt = 0;
 /* 1文字前が 'g' だったかどうか判定のフラグ */
 int flg = 0;

 if( fl == NULL ) {
  /* ここには、ファイルが開けなかったよ、というエラーを書く */
  printf( "ファイルがないみたい。\n" );
  exit( -1 );
 }

 while( ( c = fgetc( fl ) ) != EOF ) {
  if( flg ) {
   if( c == 'c' ) {
    gccnt++;
   } else {
    flg = 0;
   }
  }
  flg = ( c == 'g' );

  if( ++cnt == 100 ) {
   /* 結果表示 */
   showResult( gccnt, cnt );
   /* 変数の初期化 */
   cnt = 0;
   gccnt = 0;
  }
 }

 /* 文字数が100じゃ割り切れなかった場合ここで表示 */
 if( cnt != 0 ) {
  showResult( gccnt, cnt );
 }
 fclose( fl );

 return( 0 );
}

void showResult( int gccnt, int cnt )
{
 printf( "%d 文字の中に 'gc'を %d 個みつけました。\n", cnt, gccnt );
}
    • good
    • 0
この回答へのお礼

ありがとうございます。
なんとか、実行することができました。まだ、ファイル処理の書き方になれてなくて、うまくいかなかったんですが、たすかりました。
ほんとうにありがとうございました。

お礼日時:2001/11/25 01:04

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