• 締切済み

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

 お世話になっています。  前回、文字列の検索の質問をしたものです。  このプログラムは文字列を入力して、ファイルから文字列を検索する。  そして、検索した文字列の総数と、存在する行数目を出すというものです。    現状の問題は、検索した文字列の総数は出るようになりました。      しかし、存在する行だけを出したいのに、全ての行数目を      出してしまいます。           どのようにすれば検索した文字列のある行数目だけを表示できるようになるのでしょうか。  以下、現在のソースの状態です。 #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; }

  • mikui
  • お礼率16% (1/6)

みんなの回答

回答No.2

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

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

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

mikui
質問者

お礼

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

関連するQ&A

  • 複数条件でのカウント

    #include <stdio.h> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 //ファイル検索 main () { FILE *fp; //ファイルポインタ char filename[256]; //ファイル名 char key[128]; //検索文字列 char c; int keylen; //検索文字列の長さ int i = 0; //検索文字列の位置 int search = FALSE; //検索中フラグ int count = 0; //検索文字列出現回数 //検索対象ファイル名と検索文字列を決定 printf("ファイル名を入力してください > "); scanf ("%s", filename); printf("検索文字列 > "); scanf("%s", key); keylen = strlen(key); //ファイルオープン if((fp = fopen(filename, "r")) == NULL) { printf("ファイルオープンエラー\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; search = FALSE; } } fclose(fp); printf("出現回数 %d\n", count); return 0; } というものを作りましたが、検索文字列を二つ指定したい場合はコンパイルの画面でどのように入力すればいいのでしょう

  • ファイルの置換

    ファイルを置換するプログラムを作ったのですがうまく置換してくれません。コードは以下のように書きました。(コンパイラは出来ました) #include <stdio.h> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 main() { FILE *fp; char filename[256]; FILE *outfp; char outfilename[256]; char key[128]; char str[128]; char c; int p; int keylen; int i=0 ; int search=FALSE; int count =0; printf(" enter filename"); scanf("%s",filename); printf("seach word"); scanf("%s",key); keylen=strlen(key); printf("change word"); scanf("%s",str); if((fp=fopen(filename,"r"))==NULL) { printf("file open error"); exit(1); } strcpy(outfilename,filename); strcat(outfilename,"_"); if((outfp=fopen(outfilename,"w"))==NULL) { printf("file open error"); exit(1); } while((c=fgetc(fp))!=EOF) { if(search) { if(c != key[i]) { search=FALSE; for(p=0;p<i;p++) { fputc(key[p],outfp); } fputc(c,outfp); i=0; } else{i++;} } else { if(c==key[i]) {search=TRUE;i++;} else {fputc(c,outfp);} } if (keylen==i) { count++; fputs(str,outfp); search=FALSE; i=0; } } fclose(fp); fclose(outfp); printf("apperance number %d\n",count); return 0; } どこか間違っていますか?教えてください。

  • 文字列について

    textファイルをいくつかに分割して保存しようと思い、以下のプログラムを作りましたが、うまくいきません。 予定では "0000.txt", "0001.txt", ....と文字列を生成するはずです。 #include <stdio.h> #include <string.h> #define LENGTH 4 //番号の桁数 void filename(int n) {    char name[LENGTH +4 +1];    char text[5] = ".txt";    int i;    for(i = 0; i <= LENGTH; i++)       name[i] = '0';    i = LENGTH;    //自然数を文字列に変換    do{       name[i] = (char)(n%10 + 48);       i--;       n /= 10;    }while(n != 0 && i >= 0);    strcat(name, text);    printf("filename:%s", name); } int main(void) {    int i;    for(i = 0; i < 5; i++){       filename(i);       printf("\n");    }    return 0; } 実行結果は filename:00000@.txt filename:00001.txt filename:00002.txt filename:00003.txt filename:00004.txt このように、文字化けしています。 何が原因なのでしょうか。 よろしくお願いします。

  • strtol関数で文字列の有無を判定したい

    プログラミング初心者です。 Visal Studio 2010を使用してC++の勉強をしています。 strtol関数を使って、変換不可能な文字列が返ってきたらtrue。何も返ってこなかったらfalse。としたいのですが、ifの()の中身をどう書けばよいのかわかりません。どなたか教えて頂けないでしょうか。 //サンプル int i; char cstr[]="12h34"; char *pc; i = (int)strtol(cstr,&pc,0); if( ??? ){ cout << "if true" << endl; }else{ cout << "if false" << endl; } 以上になります。お読みいただきありがとうございました。 よろしくお願いいたします。

  • 文字列検索について

    下記のようなC++プログラムにおいて、Good Morning! の「r」以後が、 検索にひっかからないで、-1を返します。 何故なのか、どうぞよろしくお願いします。 -------------------------------------------------------- #include <iostream> #include <cstring> using namespace std; int flag = 0; // 該当文字があったかどうかのフラグ int strch_idx(const char* s, char c){ int temp; cout << strlen(s) << endl; for(int i=0; i<(signed)strlen(s); i++){ if(*s == c){ temp=i+1; // 配列のインデックスは0オリジンだが、インデックスは1からだから1+する flag = 1; break; } s++; } if(flag == 1) return temp; else return -1; } int main(){ const char* s = "Good Morning!"; int idx = strch_idx(s, 'i'); cout << "検索文字のインデックス:" << idx << endl; return 0; }

  • CSVデータの行数カウント

    PHP初心者です。 アドバイスよろしくお願いします。 CSVデータ 20060802:1,AAA,少し 20060802:2,AAA,少し 20060802:3,AAA,少し 20060802:4,BBB,大きい 20060802:5,AAA,小さい 20060802:6,AAA,小さい 20060802:7,AAA,小さい があるとき、 そのCSVデータを読み込んで データの3列目を基準としてデータがいくつあるかを数えたい。 例えば 少し・・・・3 大きい・・・・1 小さい・・・・1 というふうに数えたい。 $filename = CSVデータファイル; $fp = fopen("$filename", "r"); if($fp == false){ exit; } else { for$i = 0; $i < sizeof($fp); $i++){ $line = explode(",", $fp[$i]); // ここで // $i[2]==AAA // のとき、AAAの行数をカウントする処理をしたい。 } }

    • ベストアンサー
    • PHP
  • 構造体の文字列データをファイルへ書き込む方法は?

    構造体の文字列データをファイルへ書き込む方法として、構造体のデータを一気に書き込まずに、データ毎に書き込むことを勉強としてやってみようとしました。 数字の場合はうまくいったのですが、文字列の場合が分かりません。 ご存知の方、よろしくお願いいたします。 <数字の場合> typedef struct { int m1, m2; } Data; fwrite(&data[i].m1, sizeof(int), 1, fp); fwrite(&data[i].m2, sizeof(int), 1, fp); <文字列の場合> #include <stdio.h> typedef struct { char m1[10], m2[10]; } Data; int main() { static Data data[3] = { { "a1", "b1"}, { "c1", "d1"}, { "e1", "f1"}, }; Data data2[10]; FILE *fp; int i, n; fp = fopen("file.dat", "wb"); if (fp == NULL) return 1; for (i = 0; i < 3; i++) { fwrite(&data[i].m1, sizeof(Data.m1[10]), 1, fp); ← sizeofでエラーが出る fwrite(&data[i].m2, sizeof(Data.m2[10]), 1, fp); } fclose(fp); 以下省略

  • 文字列をファイルから検索する

    gsdhkfghsdbfdbnsjkfndjsandfjaghfdsafdsafdsag dbsahfgjaf fdjashfjdnsajfndjbreakfdjsabdhkasb dslihfldsajfkldjsaklfndgbhfbrnsajkgbnfdjkanfjdn sdhfjkhskagfeabrrfajkgkjdshfjhjlsagnfrjsergnre fkdhsalkjdfjsabngkrehgufjkdsngjkeshgkjernsjklgn idslfgdhsajkghbrkeubhgjkdbnsjgfndjsngrjklnfjl inportantjldsghdfksghnjkdfnjfnhlsdghnlrjensgl jshdfbnjkgnbfdjksgjkfdjskgnfjkdsngjkfnsdjgnfkls dbksafbgdskafdjksaf important gyjkgbjkbkjbfgyjbuk jkhbjkbnfsdkjzfbvdkszbkdjsbfdks ifkldsgjkfnsal klfjszdklgfdklsgn kfjagklf gkorhjsglfnsl o;sjag;ra kflhgsglfjnglfdnsgklirejsigjrtklesgkrtm kfjsdglkjklsdgg lf;jgr;ejsig;lrnesigrtjniesjgesgi ↑「ser.txt」 今、ファイル操作を勉強しているんですけどこの問題がどうしても解けません上の文字列から「important」という文字列を検索して見つかったその場所を「111111111」に置き換えたいんですけど本当にわかりません fseekっていうのを使うと思うんですけど・・・・ #include< stdio.h> #include< stdlib.h> void main(){ FILE *fp; char a[]={"important"}; int i,j; if((fp=fopen("ser.txt","r+"))==NULL){ printf("error\n"); exit(1); } ??? ここからがわかりませんTT

  • ポインタと配列

    次のソースで、結果表示でポインタを使いたいのですが、うまくいきません。1件しか表示されないのです。 ポインタの扱いがおかしいのだと思いますが、どうしたらよいでしょうか? #include <stdio.h> #include <string.h> int search(char key[256],FILE *fp,char *result[256][256]); main(void) { FILE *fp; int rep,n,i; char x[256],key[256],*result[256][256]; printf("検索キーワードを入力してください。\n" "キーワード>"); gets(key); if((fp=fopen("personal.txt","r"))==NULL) { printf("ファイルをオープンできません\n"); exit(1); } printf("=====検索結果=====\n"); n=search(key,fp,result); for(i=0;i<n;i++) { printf("%s\n",result[i]); } printf("検索結果:%d件です。\n",n); fclose(fp); } int search(char key[256],FILE *fp,char *result[256][256]) { int n=0; char *p,word[256],*name; while((p=fgets(word,256,fp))!=NULL) { if(strstr(word,key)!=NULL) { name=strtok(p," "); strcpy(result[n],name); n++; } } return n; } 実行すると、下の警告がでます。 illegal pointer combination(param)

  • 文字列の探索

    ファイル名を指定して文字列の探索を行うというプログラムをC言語で作成したのですが、 コンパイルのときに警告で「問題のあるポインタの変換(関数 main )」と出て、うまい具合に動きません。改良点を教えてください。 #include<stdio.h> #include<string.h> #include<stdlib.h> unsigned char *s1; unsigned char *s2; unsigned char *cp; FILE *fp; char fname[64]; void TestStrStr(void); main(){ s1 = calloc(256, sizeof(unsigned char)); s2 = calloc(256, sizeof(unsigned char)); printf("Input Filename..."); scanf("%s",fname); while(1){ fp = fopen(fname, "r"); if(fp == NULL){ printf("ファイルを開くことができません...\n"); printf("Input Filename..."); scanf("%s",fname); }else break; } s1=fp; // printf("文字列1を入力してください:"); // scanf("%s",s1); printf("文字列2を入力してください:"); scanf("%s",s2); TestStrStr(); return 0; } void TestStrStr(void){ cp = strstr(s1, s2); if(cp == NULL) printf("'%s'に'%s'のいずれの文字も含まれない.\n", s1, s2); else printf("'%s'の中に現れる'%s'という文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1); free(s1); free(s2); }