• 締切済み

文字列のある行数を表示する

 お世話になっています。  前回、文字列の検索の質問をしたものです。  このプログラムは文字列を入力して、ファイルから文字列を検索する。  そして、検索した文字列の総数と、存在する行数目を出すというものです。    現状の問題は、検索した文字列の総数は出るようになりました。      しかし、存在する行だけを出したいのに、全ての行数目を      出してしまいます。           どのようにすれば検索した文字列のある行数目だけを表示できるようになるのでしょうか。  以下、現在のソースの状態です。 #include <stdio.h> #include <fstream> #include <iostream> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 using namespace std; int main( ) { FILE *fp;//ファイルポインタ char filename[256];//ファイル名 char key[128];//検索文字列 char key2[128];//見つけた文字列の保存 int iCnt[128];//見つけた文字 char c;    int keylen;//検索文字列の長さ int i = 0;//検索文字列の位置 int search = FALSE;//検索中フラグ int count = 0;//検索文字列出現回数 int j = 0; //検索対象ファイル名と検索文字列をコンソール入力 cout << "ファイル名を入力してください⇒  "; cin >> filename ; cout << "検索文字列を入力してください⇒  "; cin >> key; keylen = strlen(key); if((fp = fopen(filename,"r")) == NULL)     { cout << "ファイルオープンエラー\n" ; exit(1); } //ファイル読み込み while((c = fgetc(fp)) != EOF) { if(search) {//検索中       //検索文字列に一致しない文字が現れた    if(c != key[i]) { search = FALSE; i = 0; } else{  i++; } }   else{ //検索中ではない if(c == key[i]) { search = TRUE; i++; } }     //検索文字列と全て一致した場合 if(keylen == i) { count++; i = 0; iCnt[i] = 1; search = FALSE; } } fclose(fp); cout << "出現回数は " << count << '\n'; //ファイル(filename)からの読み込み        ifstream ifs(filename); string buf; while(getline(ifs, buf) && ifs ) { // ここで行目数の処理を行っています。 j++; if((count++ && search = FALSE) == TRUE) { cout << j << "行目" << endl; } } return 0; }

みんなの回答

回答No.2

「int iCnt[128];//見つけた文字」はどう使おうとしていますか? iCnt[行目]が1ならその行に検索文字が見つかったことを表すフラグにしたいのではないでしょうか。 で、表示させるときにこの変数を見て、表示させるかどうか判断したいのではないでしょうか。 検索の時・・・ ・行数目を入れる変数を準備して0をセット、最初にiCntを全クリア ・ファイルから1文字とってきた時に改行文字かどうか判断して、改行なら行数目を1増やす ・文字列が見つかったときはiCntの該当行にフラグを立てる 表示の時・・・ ・行数目の変数を0クリア ・1行読み込んで、iCntの該当行のフラグをチェックしてフラグが立っていたら読み込んだ文字列を表示 ・行数目の変数を1増やして、次の行の処理へ

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

ザッと見ただけですけれど、 > if((count++ && search = FALSE) == TRUE) 検索対象文字列が当該の行に存在しているかどうかを判定するために、 検索文字列の出現回数(count)や検索中フラグ(search)が 必要なのでしょうか。 検索文字列が「何回」出現したかは、「どの行に」出現したかとは無関係のはずです。 また、当該行を検索中であるかどうかのフラグも、「どの行に」出現したかとは無関係のはずです。 countやsearchではない、別の変数を導入する必要があると思います。

mikui
質問者

お礼

ご回答ありがとうございました。 何とか問題が解決しました。strstr関数を使うことで条件はクリアされました。

すると、全ての回答が全文表示されます。

関連するQ&A