- 締切済み
C言語 カウント ファイル出力
C言語 ファイル入出力 文字カウント C言語の勉強をしています。 ファイル入出力+文字カウントがわからなく質問させてもらいました。 問題の内容は文字EADBACABEEAACが入っているファイルmon1.txtを読み込み 何回文字が登場するのかをカウントするというものです。 カウント結果はコマンドプロンプトとmon1.txtに出力します。 自分でかけるところまで書いてみたのですが※の部分がどうやれば良いのかわからず質問させていただきました。 ご教授よろしくお願いします。 #include <stdio.h> #include <ctype.h> int main() { FILE *fp; char ch; int i; int a; int b; int c; int d; int e; fp = fopen("mon1.txt", "w"); if(fp == NULL) { printf("出力ファイルオープンエラー\n"); return -1; } for(i = 0; ※ == '\0'; i++) { switch (※) { case 'A': a++; break; case 'B': b++; break; case 'C': c++; break; case 'D': d++; break; case 'E': e++; break; default: break; printf("A[%d]回、B[%d]回、C[%d]回、D[%d]回、E[%d]回",a,b,c,d,e); fprintf(fp, "A[%d]回、B[%d]回、C[%d]回、D[%d]回、E[%d]回",a,b,c,d,e); } } return 0; }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
ANo2: × while (*pBufPtr != NULL) ○ while (*pBufPtr != '\0')
- loves0070
- ベストアンサー率0% (0/1)
一部間違えてました。 sprintf(writeBuf, "A[%d]回、B[%d]回、C[%d]回、D[%d]回、E[%d]回",count[0],count[1],count[2],count[3],count[4]); でした。
- loves0070
- ベストアンサー率0% (0/1)
ソースの一部なら良いのですが、全てのソースだったとしたら、 このソースには問題があります。 ファイルの読み書きで開いていない。 "w"ではなくて"rw"とするべきでしょう。 その後にfseek等で位置を戻したり文字数が読み込みより少ないなら 後ろのデータを消したりしないといけないので、 "r"で開いた後に改めて"w"したほうが楽と思います。 forの使い方とswitchの使い方がまだ理解できてないようなので 再度確認してください。 以前の回答者が説明しているので割愛します。 以下サンプルです。 エラーチェックは適当です。 int main() { FILE *fp; char buf[50]; char writeBuf[100]; char *pBufPtr; char count[5]; memset(buf, 0x00, sizeof(buf)); memset(writeBuf, 0x00, sizeof(writeBuf)); memset(count, 0x00, sizefo(count)); if ((fp = fopen("mon1.txt", "r")) == NULL) { return -1; } fgets(buf, sizeof(buf), fp); fclose(fp); pBufPtr = buf; while (*pBufPtr != NULL) { switch(*pBufPtr) { case 'a': count[0]++; break; case 'b': count[1]++; break; case 'c': count[2]++; break; case 'd': count[3]++; break; case 'e': count[4]++; break; default: break; } pBufPtr++; } if ((fp = fopen("mon1.txt", "w")) == NULL) { return -1; } sprintf(writeBuf, "A[%d]回、B[%d]回、C[%d]回、D[%d]回、E[%d]回",a,b,c,d,e); printf(writeBuf); fprintf(fp, writeBuf); fclose(fp); return 0; }
- kmee
- ベストアンサー率55% (1857/3366)
> ※の部分 まず、日本語(あるいは、あなたの得意な自然言語)で、「※の部分」に何を書きたいか説明できますか? で、それを書けたとしても、正しく動作しないと思われます。 > for(i = 0; ※ == '\0'; i++) { for(式1;式2;式3) は 「式2が真の間ループする」 です。 ※ == '\0' だと、 「※が'\0'の間はループし、'\0'でなくなったらループを終了する」です。 「文字列が続いている間ループする」のなら、ループしたいのは '\0'で無いときで、 '\0'になったら終了ですよね? > printf("A[%d]回、B[%d]回、C[%d]回、D[%d]回、E[%d]回",a,b,c,d,e); > fprintf(fp, "A[%d]回、B[%d]回、C[%d]回、D[%d]回、E[%d]回",a,b,c,d,e); この2つは、絶対に実行されません。 その理由はわかりますか? {} の対応をよくかんがえましょう