お世話になっています。
前回、文字列の検索の質問をしたものです。
このプログラムは文字列を入力して、ファイルから文字列を検索する。
そして、検索した文字列の総数と、存在する行数目を出すというものです。
現状の問題は、検索した文字列の総数は出るようになりました。
しかし、存在する行だけを出したいのに、全ての行数目を
出してしまいます。
どのようにすれば検索した文字列のある行数目だけを表示できるようになるのでしょうか。
以下、現在のソースの状態です。
#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;
}
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
「int iCnt[128];//見つけた文字」はどう使おうとしていますか?
iCnt[行目]が1ならその行に検索文字が見つかったことを表すフラグにしたいのではないでしょうか。
で、表示させるときにこの変数を見て、表示させるかどうか判断したいのではないでしょうか。
検索の時・・・
・行数目を入れる変数を準備して0をセット、最初にiCntを全クリア
・ファイルから1文字とってきた時に改行文字かどうか判断して、改行なら行数目を1増やす
・文字列が見つかったときはiCntの該当行にフラグを立てる
表示の時・・・
・行数目の変数を0クリア
・1行読み込んで、iCntの該当行のフラグをチェックしてフラグが立っていたら読み込んだ文字列を表示
・行数目の変数を1増やして、次の行の処理へ
No.1
- 回答日時:
ザッと見ただけですけれど、
> if((count++ && search = FALSE) == TRUE)
検索対象文字列が当該の行に存在しているかどうかを判定するために、
検索文字列の出現回数(count)や検索中フラグ(search)が
必要なのでしょうか。
検索文字列が「何回」出現したかは、「どの行に」出現したかとは無関係のはずです。
また、当該行を検索中であるかどうかのフラグも、「どの行に」出現したかとは無関係のはずです。
countやsearchではない、別の変数を導入する必要があると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- ドライブ・ストレージ Windows10でのファイル内の文字列検索 SSDに寿命? 4 2022/07/12 03:25
- Visual Basic(VBA) VBA初心者です 検索した数字の行に色をつける 5 2023/02/13 14:22
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Excel(エクセル) Excelでの検索結果を含む行だけを表示させたい 5 2023/03/10 17:08
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
文字列からタブコードを取り除...
-
VBの「As String * 128」とは?
-
VBAでの Replace関数で、ワイル...
-
EXCELで=より左の文字を一括で...
-
Excelで指数表現しないようにす...
-
エクセルで文字列の最大値を抽...
-
【Excel VBA】複数ある特定の文...
-
Excelで3E8を3.00E+8にしない方...
-
Left関数とRight関数を合わせた...
-
MS SQLServer のSQLで文字列の...
-
[C言語]fputsとfprintfの違い
-
アクセスで特定の数字以外(複...
-
同一セル内に関数と文字列を同...
-
Excel VBAでテキストを開く際の...
-
Excelはなんで先頭の0を消すん...
-
VB6のReplace関数の使い方
-
エクセルでSQLでいうところの「...
-
ファイルの中身検索と表示
-
VBScriptで指定した範囲の中で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
Excelで3E8を3.00E+8にしない方...
-
VBAでの Replace関数で、ワイル...
-
Excelで指数表現しないようにす...
-
[C言語]fputsとfprintfの違い
-
エクセルで文字列をtxtファイル...
-
同一セル内に関数と文字列を同...
-
エクセルで文字列の最大値を抽...
-
Excelはなんで先頭の0を消すん...
-
MS SQLServer のSQLで文字列の...
-
エクセル 数値データを桁をそ...
-
Left関数とRight関数を合わせた...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
Msgboxの×が押されたとき
-
sedなどで、特定の文字列の後の...
-
【Excel VBA】複数ある特定の文...
-
OnTime 使用時のプロシージャへ...
おすすめ情報