• 締切済み

探索アルゴリズム

テキストファイルを読み込んで、該当する文字列を含む行を表示するというプログラムを作りたいのです。ファイルを読み込むことはできるのですが、該当する文字列を含む行を表示するやり方がわかりません。どなたか助けてもらえないでしょうか? 一応私が作ってみたプログラムはこんな感じになったんですけど・・・ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) {  FILE *fp;  char ch;  if( argc != 3)  {  printf(" 使用法 : <プログラム名> <ファイル名> <文字> \n");  return -1;  }  if((fp = fopen(argv[1],"r")) == NULL)  {  printf("ファイルを開くことができません\n");  return -1;  }  while(( ch = fgetc(fp)) != EOF)  if(ch == *argv[2])  {  printf("%cが見つかりました\n",ch);  break;  }  fclose(fp);  return 0; }

みんなの回答

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

#include <stdio.h> #include <string.h> #include <errno.h> char *prog; int main(int argc, char *argv[]) { FILE *fp; char buf[BUFSIZ]; prog = argv[0]; if (argc != 3) { printf(" 使用法 : %s <ファイル名> <文字> \n", prog); return (errno); } if ((fp = fopen(argv[1], "r")) == NULL) { printf("ファイル(%s)を開くことができません\n", argv[1]); return (errno); } while (fgets(buf, BUFSIZ, fp) != NULL) { if (strstr(buf, argv[2]) != NULL) { printf("[%s]が見つかりました:%s", argv[2], buf); } } fclose(fp); return 0; }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

fgets を使って行単位で読み込んで strstrで行に対して文字列が含まれているか調べて その行を表示するようにすればいいと思います。

関連するQ&A

  • C言語の質問です

    下記のプログラムはテキストファイルを読み込み、AからZまでの文字(小文字、大文字は区別しない)がそれぞれ何回 現れたかを数えるプログラムです。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int count[26]; int main(int argc, char *argv[]) { FILE *fp; char ch; int i; /* ファイル名の指定を調べる */ if(argc!=2) { printf("ファイル名の指定がありません\n"); exit(1); } if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } while((ch=fgetc(fp))!=EOF) { ch = toupper(ch); if(ch>='A' && ch<='Z') count[ch-'A']++; } for(i=0; i<26; i++) printf("%c は %d 回出現\n", i+'A', count[i]); fclose(fp); return 0; } 1)int count[26]; で、なぜ26なのかが分かりません。 2)count[ch-'A']++; はどういう動作をするのか詳しく教えてほしいです。 3)よって、for文がどういう動作で表示しているのかが分かりません。 未熟者の私ですが、どなたか教えていただけないでしょうか?

  • ファイルの出力

    コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) {  FILE *fp;  char str[80];  char ch;  if (argc != 2){   printf("コマンドライン引数が違います\n");   exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL){   printf("ファイルが開けません");   exit(1);  }  while(!feof(fp)){   fgets(str, 79, fp);   if (!feof(fp)) printf("%s",str);   printf("追加しますか?(y/n)");   gets(str);   if ( toupper(*str) == 'N') break;   printf("\n");  }     if (fclose(fp) == EOF){   printf("ファイルを閉じれません\n");   exit(1);  }  return 0; } while文の   gets(str);  if ( toupper(*str) == 'N') break; この部分を  ch = getchar();  if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?

  • 「コマンドライン引数チェック」て何

    #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char gyou[1024]; int gyousuu = 0; if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } fp = fopen(argv[1], "r"); if ( fp == NULL ){ printf("fopen dekinai\n"); return -2; } while(fgets(gyou, sizeof(gyou), fp) != NULL){ gyousuu++; } fclose(fp); printf("gyousuu=%d\n", gyousuu); return 0; }    以上のプログラムはご覧のとおり、「ファイルの行数を計算」のプログラムです。 さて以上の  if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } は「コマンドライン引数チェック」を行っています。・・・  if ( argc < 2 ){の「argcは2以上である必要がある」と参考書に書いてあります。   以上ですが意味が日光手前ですが、プログラムの行数をカウントするうえで、  「コマンドライン引数チェック」とはどんな作業を行っているとこなのでしょうか!?  よろしくお願いします。  

  • 英文字の出現頻度

    英語で書かれているファイルを読み込んで英文字の出現頻度を調べるプログラムを作ったのですが、ところどころ正確な数が表示されません。どなたか教えてもらえませんか?欲を言えばスペースや改行もカウントできれば良いのですが・・・よろしくお願いしますm(_ _)m #include <stdio.h> #define N 500 int main(int argc, char *argv[]) { int c,i=0; int X[N]; FILE *fp; char ch[N]; if( argc != 2) { printf("使い方:コマンド名に続きファイル名を入れてください\n"); return -1; } fp = fopen( argv[1],"rb"); while(fgets(ch,500,fp) != NULL ) { printf("%sファイルにおけるアルファベットの出現頻度\n",argv[1],ch); { while ((c = getc(fp)) != EOF) if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') X[c]++; { for (c = 'a'; c <= 'z'; c++) printf("%c:%d\n",c, X[c]); printf("\n"); for (c = 'A'; c <= 'Z'; c++) printf("%c:%d\n",c, X[c] ); printf("\n"); } } } fclose(fp); return 0; }

  • C言語、ファイル操作、fgets()について

    次のプログラムは入力された行を読み込み、コマンドラインで指定されたファイルに書き込みます。 空白行が入力されたら、入力の終了とみなしてファイルを閉じます。続いてファイルを入力用に開き、 fgets()を使ってファイルの内容を表示するものです。 (ソースコードが長くてすみません) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char str[80]; /* コマンドライン引数を検査する */ if(argc!=2) { printf("ファイル名を指定してください\n"); exit(1); } /* 出力用にファイルを開く */ if((fp = fopen(argv[1], "w"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } printf("終了するには空白行を入力してください\n"); do { printf(": "); gets(str); strcat(str, "\n"); /* 改行を追加する */ if(*str != '\n') fputs(str, fp); } while(*str != '\n'); fclose(fp); /* 入力用にファイルを開く */ if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } /* ファイルを読み込み直す */ do { fgets(str, 79, fp); if(!feof(fp)) printf(str); } while(!feof(fp)); fclose(fp); return 0; } 【質問】fgets()内のint型の数値「79」がどうして79なのかが分かりません。     80でも良いような気がするのですが・・・

  • プログラムのソート

    "英語のテキストを読みこんで、出現する文字数のカウントをする"というプログラムを作成しました。このプログラムの出力を出現頻度順(大きい順)に並べ換えたいのですが、どの位置からソートを開始して、関数をどうすればいいのかがよく解りません。どなたかご教授下さい。 ↓取り敢えず、出来たプログラムを載せておきます。 #include<stdio.h> int main(int argc,char *argv[]) { int ch; // 小文字用 int CH; // 大文字用 int a; // str[CH]+str[ch] FILE *fp; int str[128]={0}; fp = fopen(argv[1],"r"); if(fp == NULL){ printf("I can't find it. You need to write a file name ! \n"); exit(1); }else{ printf("指定されたファイル '%s' 内の各文字の個数は以下の通り. \n",argv[1]); while((ch=fgetc(fp)) != EOF){ if(ch < 128) str[ch]++; } for(ch=0; ch<128; ch++){ if(str[ch] != 0){ if(ch>=65 && ch<=90 || ch>=97 && ch<=122){ // A~Z, a~z if(ch>=97 && ch<=122){ // a~z CH = toupper(ch); // 小文字を大文字に a = str[CH]+str[ch]; printf(" (%c)%5d (%c)%5d (%c+%c)%5d \n",CH,str[CH],ch,str[ch],CH,ch,a); } } } } fclose(fp); } return 0; }

  • 任意のファイルを別のファイルにコピーするプログラム。

    コマンドラインからコピー元、コピー先ファイル名を指定してファイルをコピーするプログラムなんですが… #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { FILE *fp; if ((fp = fopen(argv[0],"r") == NULL){ printf("ファイル%sが存在しません。\n",argv[0]);exit(-1); } if ((fp = fopen(argv[1],"w") == NULL){ printf("ファイル%sがコピーできません。\n",argv[1]);exit(-1); } fclose(fp); } どこか間違っているところがあるでしょうか? ありましたら詳しく教えてもらえると幸いです。 少し自信がないのでわかる方はよろしくおねがいします。

  • CSVファイルの内容を構造体に格納したい(Unix使用)。

    こんにちは。私は30代の男性です。 「名前」「身長」「体重」が記載されたCSVファイルの内容を読み取って、構造体の「name」「height」「weight」に格納するプログラムを作っています。CSVの内容は A,175,80 B,167,89 C,155,45 ・ ・ ・ Z,188,70 だと仮定します。数値が読み取れているか、下記のように「tp = strtok(file_image, ",\n" );」の前後に「printf("%s\n", file_image);」を置いてみたら、strtok前では全て表示されるのに、strtok後では「ABC」しか表示されません。これでは全てのデータを構造体に格納できないので、困っています。 1.どのようにすれば、数字も取り出せる(読み取れる)でしょうか? 2.効率よく構造体に格納するには、どのようにしたらよいでしょうか? アドバイスを頂ければ幸いです。宜しくお願いいたします。 #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp = NULL; int rtn = 0; if ((fp = fopen(argv[1], "r")) == NULL) { printf("ファイルオープンに失敗しました。\n"); return 1; } if (argc != 2) { printf("ERROR: オプションの数に過不足があります。\n"); return 1; } rtn = change_csv(fp); return 0; } int change_csv(FILE *fp) { int i; int j; char file_image[256]; /* 読み込んだ先のメモリの領域 */ char *tp; for (i = 0; i <= 256; i++) { if (fgets(file_image, 256, fp) == NULL) { if (ferror(fp) != 0) { printf("ERROR: 読み込みに失敗しました。\n"); return 1; } } if (feof(fp) != 0) { break; } printf("%s\n", file_image); tp = strtok(file_image, ",\n" ); printf("%s\n", file_image); } fclose(fp); return 0; }

  • ファイルの内容の表示

    実行時のコマンドライン引数で指定したファイルの内容を、行番号付きで画面に表示するプログラムを作る という問題です。ヒントも与えられています。 行番号付きの表示、コマンドライン引数の利用。両者を組み合わせればできるはずだ >  main関数の引数にargcとargvを指定して、コマンドライン引数をファイル名として利用する。キーボード入力を促す文(プロンプト)や改行チェックは不要なので書かないこと >  コマンドライン引数が指定されない場合は、メッセージを表示してプログラムを終了 >  ファイルの内容を画面表示する処理は、ユーザー定義関数put_file_contentsに記述する。仮引数には文字型のポインタ変数をひとつ指定し、ファイル名を受け渡せるようにする。put_file_contents自体の型は整数型(int)で、正常終了なら返り値0を返すこと。 行番号付きのプログラム#include<stdio.h> > int put_file(char *filename); > > int main() > { > char line[50]; > char *ptr; > > printf("ファイル名を入力:"); > fgets(line,sizeof(line),stdin); > ptr = line + strlen(line) - 1; > if(*ptr == '\n') { > *ptr = '\0'; > } > > put_file(line); > > return 0; > } > > int put_file(char *filename) > { > FILE *fp; > char buf[100]; > int line_no; > > fp = fopen(filename,"r"); > if (fp == NULL){ > printf("%sを開けません\n",filename); > return 1; > } > line_no = 1; > while (fgets(buf,sizeof(buf),fp) != NULL){ > printf("%3d: ",line_no); > printf("%s",buf); > line_no++; > } > fclose(fp); > > return 0; > } で、コマンドライン引数のプログラムは#include<stdio.h> void write_key_inputs(char *filiname); int main(int argc, char *argv[1]) { write_key_inputs(argv[1]); return 0; } void write_key_inputs(char *filename) { FILE *fp; char buf[100] ; fp = fopen(filename,"w"); while(fgets(buf, sizeof(buf),stdin) != NULL) { fputs(buf, fp); } fclose(fp); return ; } です。これらを組み合わせて少しいじると出来るみたいなのですが、できていません。ちなみに私が考えたプログラムは #include<stdio.h> int put_file_contents(char *filename); int main(int argc,char *argv[]) { int i; if(argc == 1){ printf("コマンドライン引数がありません\n"); return 1; } for(i = 0;i<argc;i++) printf("argv[%d]は「%s」です\n",i,argv[i]); put_file(i); return 0; } int put_file(char *filename) { FILE *fp; char buf[100]; int line_no; fp = fopen(filename,"r"); line_no = 1; while (fgets(buf,sizeof(buf),fp) != NULL){ printf("%3d: ",line_no); printf("%s",buf); line_no++; } fclose(fp); return 0; } です。コマンドライン引数は表示されるのですが、行番号が表示されません。どうしたらいいでしょうか??

  • strings

    stringsと全く同じプログラムを作りたいんですが、どうもうまくいきません。 4文字以上読み込めるファイルが続いた時に表示すればいいんですが。。 ヒントを頂けるとありがたいです。 よろしくおねがいします。 #include<stdio.h> #define maxc 256 int main(int argc,char *argv[]) { FILE *fpr; char tmp[maxc]; char c; int i,evi=1; if(argc!=2){ //もしargcの数が2じゃなければ成り立たないからエラーを出す。 printf("それじゃできませんよ。\n"); return(-1); } fpr=fopen(argv[1],"r"); if(fpr==NULL){ printf("%s がありませんね。\n",argv[1]); return(-1); } i=0; /*****************読み込める時****************/ while((c=fgetc(fpr))!=EOF){ //fprから一文字ずつ読み込む。 if(c >= 0x20 && c<=0x7e){ //読み込める文字の場合 tmp[i]=c; i++; evi=0; //証拠を残す。 } /*****************読み込めない場合*********************/ else{ //読み込めない文字の場合 \0 or \n if(evi==0){ //一文字前が読み込める時 つまり\nの時 printf("\n"); } i=0; evi=1; } if(i>=4){ printf("%s",tmp); i=0; } } fclose(fpr); return(0); }

専門家に質問してみよう