【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22196

ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---isii(2005/07/27 17:25:32)


ファイルから、文字列を読み込み、その中のアルファベットの個数をそれぞれ出力したいのですが、出力するときにjまでしか表示されないのですが、どこが悪いのでしょうか?
それと、この状態でコンパイルしたときに、最後のfprintfの行で "out of memory"というえらーがでるのですが、どうしたらいいのでしょうか。

プログラムは、
#include<stdio.h>
main()
{
FILE *fp;
int x[100],i;
char str[80];

if((fp=fopen("abstract_2.txt","r"))==NULL){
printf("error\n");
return 0;
}

while(fgets(str,79,fp)!=NULL){
for(i=0;i<=79;i++){
if(str[i]=='a'||str[i]=='A'){
x[0]++;}
else if(str[i]=='b'||str[i]=='B'){
x[1]++;}
else if(str[i]=='c'||str[i]=='C'){
x[2]++;}
else if(str[i]=='d'||str[i]=='D'){
x[3]++;}
else if(str[i]=='e'||str[i]=='E'){
x[4]++;}
else if(str[i]=='f'||str[i]=='F'){
x[5]++;}
else if(str[i]=='g'||str[i]=='G'){
x[6]++;}
else if(str[i]=='h'||str[i]=='H'){
x[7]++;}
else if(str[i]=='i'||str[i]=='I'){
x[8]++;}
else if(str[i]=='j'||str[i]=='J'){
x[9]++;}
else if(str[i]=='k'||str[i]=='K'){
x[10]++;}
else if(str[i]=='l'||str[i]=='L'){
x[11]++;}
else if(str[i]=='m'||str[i]=='M'){
x[12]++;}
else if(str[i]=='n'||str[i]=='N'){
x[13]++;}
else if(str[i]=='o'||str[i]=='O'){
x[14]++;}
else if(str[i]=='p'||str[i]=='P'){
x[15]++;}
else if(str[i]=='q'||str[i]=='Q'){
x[16]++;}
else if(str[i]=='r'||str[i]=='R'){
x[17]++;}
else if(str[i]=='s'||str[i]=='S'){
x[18]++;}
else if(str[i]=='t'||str[i]=='T'){
x[19]++;}
else if(str[i]=='u'||str[i]=='U'){
x[20]++;}
else if(str[i]=='v'||str[i]=='V'){
x[21]++;}
else if(str[i]=='w'||str[i]=='W'){
x[22]++;}
else if(str[i]=='x'||str[i]=='X'){
x[23]++;}
else if(str[i]=='y'||str[i]=='Y'){
x[24]++;}
else if(str[i]=='z'||str[i]=='Z'){
x[25]++;}
}
}

fprintf(fp,"a=%d\nb=%d\nc=%d\nd=%d\ne=%d\nf=%d\ng=%d\nh=%d\ni=%nj=%d\n"←ここで改行しています。
"k=%d\nl=%d\nm=%d\nn=%d\no=%d\np=%d\nq=%d\nr=%d\ns=%d\nt=%d\n"
"u=%d\nv=%d\nw=%d\n x=%d\ny=%d\nz=%d",
x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],
x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18],
x[19],x[20],x[21],x[22],x[23],x[24],x[25]);

fclose(fp);
}

という感じです。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、 22198 烏龍茶 2005/07/27 17:59:32
<子記事> Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、 22199 まきじ 2005/07/27 18:01:24
<子記事> Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、 22204 おでん 2005/07/27 18:26:00


No.22198

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---烏龍茶(2005/07/27 17:59:32)


気になった点をいくつか。(外しているかも)

>fprintf(fp,"a=%d\nb=%d\nc=%d\nd=%d\ne=%d\nf=%d\ng=%d\nh=%d\ni=%nj=%d\n"←ここで改行しています。
>"k=%d\nl=%d\nm=%d\nn=%d\no=%d\np=%d\nq=%d\nr=%d\ns=%d\nt=%d\n"
>"u=%d\nv=%d\nw=%d\n x=%d\ny=%d\nz=%d",
>x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],
>x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18],
>x[19],x[20],x[21],x[22],x[23],x[24],x[25]);

↑こんな指定方法ができるかどうか知りませんが、
fprintf(fp,"a=%d\nb=%d\nc=%d\nd=%d\ne=%d\nf=%d\ng=%d\nh=%d\ni=%nj=%d\n",x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9]);
fprintf(fp,"k=%d\nl=%d\nm=%d\nn=%d\no=%d\np=%d\nq=%d\nr=%d\ns=%d\nt=%d\n",x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18]);
fprintf(fp,"u=%d\nv=%d\nw=%d\n x=%d\ny=%d\nz=%d",x[19],x[20],x[21],x[22],x[23],x[24],x[25]);
こんな感じでできないでしょうか?
あと、「i=%n」になっているみたいです。

>if((fp=fopen("abstract_2.txt","r"))==NULL){
読込み専用でファイルを開いているようですが、本当に出力できてるのかな?

>main()

int main(void){
とした方が良い(らしい)です。環境によってはけられるとかなんとか。。。


この投稿にコメントする

削除パスワード

No.22201

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---烏龍茶(2005/07/27 18:08:29)



>>fprintf(fp,"a=%d\nb=%d\nc=%d\nd=%d\ne=%d\nf=%d\ng=%d\nh=%d\ni=%nj=%d\n"←ここで改行しています。
>>"k=%d\nl=%d\nm=%d\nn=%d\no=%d\np=%d\nq=%d\nr=%d\ns=%d\nt=%d\n"
>>"u=%d\nv=%d\nw=%d\n x=%d\ny=%d\nz=%d",
>>x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],
>>x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18],
>>x[19],x[20],x[21],x[22],x[23],x[24],x[25]);
>
>↑こんな指定方法ができるかどうか知りませんが、

↑試してみたらできた。
ふ〜ん。はじめて知った。


この投稿にコメントする

削除パスワード

No.22202

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---isii(2005/07/27 18:19:31)


nj=%d\n",x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9]);
>fprintf(fp,"k=%d\nl=%d\nm=%d\nn=%d\no=%d\np=%d\nq=%d\nr=%d\ns=%d\nt=%d\n",x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18]);
>fprintf(fp,"u=%d\nv=%d\nw=%d\n x=%d\ny=%d\nz=%d",x[19],x[20],x[21],x[22],x[23],x[24],x[25]);
>こんな感じでできないでしょうか?
>あと、「i=%n」になっているみたいです。
>>if((fp=fopen("abstract_2.txt","r"))==NULL){
>読込み専用でファイルを開いているようですが、本当に出力できてるのかな?

fprintf(fp,"a=%d\nb=%d\nc=%d\nd=%d\ne=%d\nf=%d\ng=%d\nh=%d\ni=%d\nj=%d\n",x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9]);
fprintf(fp, "k=%d\nl=%d\nm=%d\nn=%d\no=%d\np=%d\nq=%d\nr=%d\ns=%d\nt=%d\n",x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18]);
fprintf(fp,"u=%d\nv=%d\nw=%d\nx=%d\ny=%d\nz=%d",x[19],x[20],x[21],x[22],x[23],x[24],x[25]);

と書き直したらエラーは出なくなりました。
表示もzまで表示できるようになりました。

それと、モードを"a"に直しました。

けれど、出力が、t=1837となっていて、それ以外は全部"0"になっているのですが、何が悪いんでしょうか。



この投稿にコメントする

削除パスワード

No.22203

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---まきじ(2005/07/27 18:24:31)


>けれど、出力が、t=1837となっていて、それ以外は全部"0"になっているのですが

x を初期化してないからです。


この投稿にコメントする

削除パスワード

No.22205

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---isii(2005/07/27 18:31:48)


>x を初期化してないからです。

xの初期化というのは、
for(i=0;i<100;i++){
x[i]=0;}
ということでいいんですか?


この投稿にコメントする

削除パスワード

No.22206

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---烏龍茶(2005/07/27 18:50:43)


>>x を初期化してないからです。
>
>xの初期化というのは、
> for(i=0;i<100;i++){
> x[i]=0;}
>ということでいいんですか?

はい。
あと、宣言時に
int x[100] = {0};
ってすればできたような記憶があります


この投稿にコメントする

削除パスワード

No.22207

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---isii(2005/07/27 19:00:53)


初期化をしたのですが、結果が変わりません。
今できているものは、

#include<stdio.h>
main(void)
{
FILE *fp;
int x[100],i;
char str[80];

for(i=0;i<100;i++){←この部分
x[i]=0;}

if((fp=fopen("abstract_2.txt","a"))==NULL){
printf("error\n");
return 0;
}


while(fgets(str,79,fp)!=NULL){
for(i=0;i<=79;i++){
if(str[i]=='a'||str[i]=='A'){
x[0]++;}
else if(str[i]=='b'||str[i]=='B'){
x[1]++;}
else if(str[i]=='c'||str[i]=='C'){
x[2]++;}
else if(str[i]=='d'||str[i]=='D'){
x[3]++;}
else if(str[i]=='e'||str[i]=='E'){
x[4]++;}
else if(str[i]=='f'||str[i]=='F'){
x[5]++;}
else if(str[i]=='g'||str[i]=='G'){
x[6]++;}
else if(str[i]=='h'||str[i]=='H'){
x[7]++;}
else if(str[i]=='i'||str[i]=='I'){
x[8]++;}
else if(str[i]=='j'||str[i]=='J'){
x[9]++;}
else if(str[i]=='k'||str[i]=='K'){
x[10]++;}
else if(str[i]=='l'||str[i]=='L'){
x[11]++;}
else if(str[i]=='m'||str[i]=='M'){
x[12]++;}
else if(str[i]=='n'||str[i]=='N'){
x[13]++;}
else if(str[i]=='o'||str[i]=='O'){
x[14]++;}
else if(str[i]=='p'||str[i]=='P'){
x[15]++;}
else if(str[i]=='q'||str[i]=='Q'){
x[16]++;}
else if(str[i]=='r'||str[i]=='R'){
x[17]++;}
else if(str[i]=='s'||str[i]=='S'){
x[18]++;}
else if(str[i]=='t'||str[i]=='T'){
x[19]++;}
else if(str[i]=='u'||str[i]=='U'){
x[20]++;}
else if(str[i]=='v'||str[i]=='V'){
x[21]++;}
else if(str[i]=='w'||str[i]=='W'){
x[22]++;}
else if(str[i]=='x'||str[i]=='X'){
x[23]++;}
else if(str[i]=='y'||str[i]=='Y'){
x[24]++;}
else if(str[i]=='z'||str[i]=='Z'){
x[25]++;}
}
}

fprintf(fp,"a=%d\nb=%d\nc=%d\nd=%d\ne=%d\nf=%d\ng=%d\nh=%d\ni=%d\nj=%d\n",x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9]);
fprintf(fp, "k=%d\nl=%d\nm=%d\nn=%d\no=%d\np=%d\nq=%d\nr=%d\ns=%d\nt=%d\n",x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18]);
fprintf(fp,"u=%d\nv=%d\nw=%d\nx=%d\ny=%d\nz=%d",x[19],x[20],x[21],x[22],x[23],x[24],x[25]);

fclose(fp);
}
なのですが、どこが違うのかさっぱり見当がつきません。
どこか悪いのでしょうか。


この投稿にコメントする

削除パスワード

No.22208

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---まきじ(2005/07/27 19:09:23)


>fprintf(fp, "<snip>s=%d\nt=%d\n",<snip>,x[18]);
>fprintf(fp,"<snip>",x[19],x[20],<snip>);

t は x[19] にカウントされている。
2 番目の fprintf() の引数に x[19] が指定されていない。

# もっと簡単になるので、考えてみてください。
# これでは、スパゲティーソースですよ(^^;


この投稿にコメントする

削除パスワード

No.22210

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---isii(2005/07/27 19:23:33)


>>t は x[19] にカウントされている。
>>2 番目の fprintf() の引数に x[19] が指定されていない。

直してみたら,"t="というのは直りました。
けれど、相変わらず、他が全部0のままです。
どうしたらいいんでしょうか。

># もっと簡単になるので、考えてみてください。
># これでは、スパゲティーソースですよ(^^;

これ以外に、まったく思いつきませんでした。
できれば、ヒントなどを教えていただけると助かります。






この投稿にコメントする

削除パスワード

No.22212

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---まきじ(2005/07/27 19:28:04)


>できれば、ヒントなどを教えていただけると助かります。

文字列を読み込むファイル(自分で適当に文字列を入れる)と
結果を書き込むファイルは別々にした方が良いと思います。


この投稿にコメントする

削除パスワード

No.22211

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---烏龍茶(2005/07/27 19:23:41)


>>fprintf(fp, "<snip>s=%d\nt=%d\n",<snip>,x[18]);
>>fprintf(fp,"<snip>",x[19],x[20],<snip>);
>
>t は x[19] にカウントされている。
>2 番目の fprintf() の引数に x[19] が指定されていない。

↑これは、僕のミスだなぁ。
isiiさんのはじめのやり方の方が良かったかも。。。

あと、fp=fopen("xxxxx.txt", "a"); は追加書込みなので、"a+" にしないといけないかも。
それか、入力ファイルと出力ファイルをわけるとか。


># もっと簡単になるので、考えてみてください。
># これでは、スパゲティーソースですよ(^^;

#個人的にはisiiさんのソースは整然としていて好きだなぁ。
#スパゲティーはそうなんだろうけど。


#include<stdio.h>

//main(void)
int main(void)
{
  FILE *fp;
  int x[100],i;
  char str[80];

  for(i=0;i<100;i++){
    x[i]=0;}

//  if((fp=fopen("abstract_2.txt","a"))==NULL){
  if((fp=fopen("abstract_2.txt","a+"))==NULL){
    printf("error\n");
    return 0;
  }

  while(fgets(str,79,fp)!=NULL){
    for(i=0;i<=79;i++){
      if(str[i]=='a'||str[i]=='A'){
        x[0]++;}
      else if(str[i]=='b'||str[i]=='B'){
        x[1]++;}
      else if(str[i]=='c'||str[i]=='C'){
        x[2]++;}
      else if(str[i]=='d'||str[i]=='D'){
        x[3]++;}
      else if(str[i]=='e'||str[i]=='E'){
        x[4]++;}
      else if(str[i]=='f'||str[i]=='F'){
        x[5]++;}
      else if(str[i]=='g'||str[i]=='G'){
        x[6]++;}
      else if(str[i]=='h'||str[i]=='H'){
        x[7]++;}
      else if(str[i]=='i'||str[i]=='I'){
        x[8]++;}
      else if(str[i]=='j'||str[i]=='J'){
        x[9]++;}
      else if(str[i]=='k'||str[i]=='K'){
        x[10]++;}
      else if(str[i]=='l'||str[i]=='L'){
        x[11]++;}
      else if(str[i]=='m'||str[i]=='M'){
        x[12]++;}
      else if(str[i]=='n'||str[i]=='N'){
        x[13]++;}
      else if(str[i]=='o'||str[i]=='O'){
        x[14]++;}
      else if(str[i]=='p'||str[i]=='P'){
        x[15]++;}
      else if(str[i]=='q'||str[i]=='Q'){
        x[16]++;}
      else if(str[i]=='r'||str[i]=='R'){
        x[17]++;}
      else if(str[i]=='s'||str[i]=='S'){
        x[18]++;}
      else if(str[i]=='t'||str[i]=='T'){
        x[19]++;}
      else if(str[i]=='u'||str[i]=='U'){
        x[20]++;}
      else if(str[i]=='v'||str[i]=='V'){
        x[21]++;}
      else if(str[i]=='w'||str[i]=='W'){
        x[22]++;}
      else if(str[i]=='x'||str[i]=='X'){
        x[23]++;}
      else if(str[i]=='y'||str[i]=='Y'){
        x[24]++;}
      else if(str[i]=='z'||str[i]=='Z'){
        x[25]++;}
    }
  }

  fprintf(fp,"a=%d\nb=%d\nc=%d\nd=%d\ne=%d\nf=%d\ng=%d\nh=%d\ni=%d\nj=%d\n",x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9]);
//  fprintf(fp,"k=%d\nl=%d\nm=%d\nn=%d\no=%d\np=%d\nq=%d\nr=%d\ns=%d\nt=%d\n",x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18]);
//  fprintf(fp,"u=%d\nv=%d\nw=%d\nx=%d\ny=%d\nz=%d",x[19],x[20],x[21],x[22],x[23],x[24],x[25]);
  fprintf(fp,"k=%d\nl=%d\nm=%d\nn=%d\no=%d\np=%d\nq=%d\nr=%d\ns=%d\nt=%d\n",x[10],x[11],x[12],x[13],x[14],x[15],x[16],x[17],x[18],x[19]);
  fprintf(fp,"u=%d\nv=%d\nw=%d\nx=%d\ny=%d\nz=%d",x[20],x[21],x[22],x[23],x[24],x[25]); 

  fclose(fp);

  return(0);
}




この投稿にコメントする

削除パスワード

No.22199

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---まきじ(2005/07/27 18:01:24)


>if((fp=fopen("abstract_2.txt","r"))==NULL){
>fprintf(fp,・・・

fp は、読み込みモードなのに、fprintf() で書き込みしています。


この投稿にコメントする

削除パスワード

No.22204

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---おでん(2005/07/27 18:26:00)


処理は簡潔なほうが・・・

#include <stdio.h>
#include <string.h>

int main(){
    FILE *fp;
    int x[256],i;
    int ch;

    if((fp=fopen("test.txt","r"))==NULL){
        printf("error\n");
        return 0;
    }

    memset(x,0,sizeof x) ;

    while((ch= getc(fp))!=EOF){
        x[ch]++ ;
    }

    fclose(fp) ;

    for( i= 'A' ; i <= 'Z' ; i++ ){
        printf("%c=%d\n", i, x[i] + x['a'-'A'+i]) ;
    }

    return 0 ;
}



この投稿にコメントする

削除パスワード

No.22220

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---円零(2005/07/27 21:38:15)


数字と違って、アルファベットは文字コードが連続している保証はないんじゃなかったでしたっけ。

これなら…
#include <stdio.h>

int main(){
    FILE *fp;
    int x[256] = {0}, ch;
    char *upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char *lower = "abcdefghijklmnopqrstuvwxyz";

    if( (fp = fopen("test.txt", "r")) == NULL ){
        printf("error\n");
        return 1;
    }
    while( (ch = getc(fp)) != EOF ) x[ch]++;
    fclose(fp) ;
    while(*lower) printf("%c=%d\n", *lower, x[*lower++] + x[*upper++]);
    return 0 ;
}



この投稿にコメントする

削除パスワード

No.22224

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---おでん(2005/07/27 23:12:53)


>数字と違って、アルファベットは文字コードが連続している保証はないんじゃなかったでしたっけ。
>
確かにそうですね、勝手にASCIIと思い込んでいました。
申し訳ない。


この投稿にコメントする

削除パスワード

No.22228

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---かずま(2005/07/28 02:15:28)


>    while(*lower) printf("%c=%d\n", *lower, x[*lower++] + x[*upper++]);

これはダメです。
関数の引数を評価するときの副作用完了点(sequence point)は、すべての
引数の評価が終わって、関数を呼び出す直前です。

したがって、*lower と x[*lower++] のどちらが先に評価されるか処理系に
よって異なりますし、lower++ の ++ がいつ実行するかも分かりません。

実際、そのプログラムを BCC でコンパイルすると、b=... からしか表示
されません。次のように書けば、問題ありません。

    for(; *lower; lower++)
        printf("%c=%d\n", *lower, x[*lower] + x[*upper++]);



この投稿にコメントする

削除パスワード

No.22232

Re:ファイルから読み込み、アルファベットの個数を出力したいのですが、
投稿者---円零(2005/07/28 13:24:30)


おっしゃるとおりです。
うっかりしておりました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧