- 締切済み
C言語 複数ファイル操作について
Cプログラミング初心者です。 論文などの何行も文章があるようなテキストファイル(ここでは1.txtとします)と、他に予め単語をいくつか登録しているテキストファイル(2.txt)を開き、1.txtを最初の行から一行ごとに読み込み、2.txtの中にある単語が1つでもその一行の文章中に含まれていたらその一行の文章を出力し、また次の行においても2.txtの中にある単語のいずれかが含まれているかどうかを調べて含まれている場合は出力…含まれていない場合は出力せずに次の行へ…といったようにこれを1.txt内の最後の行まで繰り返し行うプログラムを作りたいのですが、自分が作ったプログラムでは含む・含まない関係なく1.txt内の文章全てが出力されてしまいます。おそらく最初のwhile文あたりがおかしいのだろうという予想はつくのですがどのように直せばよいのかわからず悩んでいます。どなたか教えていただければ嬉しいです(;_:) #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 1056 void delkaigyo(char *s1,char *s2){ char *p = s1; p=strstr(s1,s2); if(p!=NULL){ strcpy(p,p+strlen(s2)); delkaigyo(p+1,s2); } } int main(void){ FILE *fp; char *filename = "2.txt"; char str1[N]; char str2[N]; char kaigyo[] = "\n"; int i; int a=0; char fname[64]; printf("file:"); scanf("%s", fname); ←ここで1.txtを入力するとします fp = fopen(fname, "r"); while(fgets(str1, N, fp) != NULL){ delkaigyo(str1, kaigyo); memset(str1, 0, N); fread(str1, 1, N-1, fp); if((fp = fopen(filename, "r")) == NULL){ fprintf(stderr, "%serror.\n", filename); exit(EXIT_FAILURE); } while(fgets(str2, N, fp) != NULL){ delkaigyo(str2,kaigyo); if(strstr(str1,str2)!=NULL){ a = 1; printf("%s\n", str1); break; } } if(a==0){ return 0; } fclose(fp); } return EXIT_SUCCESS; }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- trapezium
- ベストアンサー率62% (276/442)
コメントだけでもなんなので、一応動くように。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 1056 void delkaigyo(char *s1,char *s2){ char *p = strchr(s1, '\n'); if (p && *p == '\n') *p = '\0'; /*p=strstr(s1,s2); if(p!=NULL){ strcpy(p,p+strlen(s2)); delkaigyo(p+1,s2); }*/ } int main(void){ FILE *fp, *f2; char *filename = "2.txt"; char str1[N]; char str2[N]; char kaigyo[] = "\n"; int i; int a=0; char fname[64]; printf("file:"); if (scanf("%63s", fname) < 1) // ←ここで1.txtを入力するとします return EXIT_FAILURE; fp = fopen(fname, "r"); if (!fp) { perror(fname); return EXIT_FAILURE; } while(fgets(str1, N, fp) != NULL){ delkaigyo(str1, kaigyo); /*memset(str1, 0, N); fread(str1, 1, N-1, fp);*/ if((f2 = fopen(filename, "r")) == NULL){ //fprintf(stderr, "%serror.\n", filename); perror(filename); exit(EXIT_FAILURE); } while(fgets(str2, N, f2) != NULL){ delkaigyo(str2,kaigyo); if(strstr(str1,str2)!=NULL){ //a = 1; printf("%s\n", str1); break; } } /*if(a==0){ return 0; }*/ fclose(f2); } return EXIT_SUCCESS; }
- trapezium
- ベストアンサー率62% (276/442)
全体的におかしいですが、 > fp = fopen(fname, "r"); > if((fp = fopen(filename, "r")) == NULL){ 最初の fp 潰してない? 少くとも別の変数使うか、最初に "2.txt" の内容バッファに読み込んじゃわないと非効率です。