アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
}

A 回答 (4件)

ANo2:


× while (*pBufPtr != NULL)
○ while (*pBufPtr != '\0')
    • good
    • 0

一部間違えてました。



sprintf(writeBuf, "A[%d]回、B[%d]回、C[%d]回、D[%d]回、E[%d]回",count[0],count[1],count[2],count[3],count[4]);
でした。
    • good
    • 0

ソースの一部なら良いのですが、全てのソースだったとしたら、


このソースには問題があります。

ファイルの読み書きで開いていない。
 "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;
}
    • good
    • 0

> ※の部分



まず、日本語(あるいは、あなたの得意な自然言語)で、「※の部分」に何を書きたいか説明できますか?

で、それを書けたとしても、正しく動作しないと思われます。

> 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つは、絶対に実行されません。
その理由はわかりますか?
{} の対応をよくかんがえましょう
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!