- ベストアンサー
大文字を小文字に変換するプログラム
if((fp4 = fopen("sample.txt","r")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ while((c=fgetc(fp4))!=EOF){/*EOFまでfp4に入力*/ if(isupper(c)){ c=tolower(c); printf("%s",c); } else printf("a"); //確認用 } } ファイルから文字を読み込んでctype関数を使って大文字から小文字に変換したいんですがうまくいきません。 コンパイルしても確認用が反応しないんでおそらくどこか間違ってると思うんですがわかりません。 ご教授宜しくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>if((fp3 = fopen("sample.txt","w")) == NULL){ >if((fp4 = fopen("sample.txt","r")) == NULL){ >fclose(fp4); >fclose(fp3); これはちょっと怪しいですね。↓のように書き込みが終わったらすぐにクローズした方が確実です。 >if((fp3 = fopen("sample.txt","w")) == NULL){ >fclose(fp3); >if((fp4 = fopen("sample.txt","r")) == NULL){ >fclose(fp4);
その他の回答 (5)
- pascal01
- ベストアンサー率28% (18/63)
変数 c の型定義が間違っているのでしょう。 見直してください。
お礼
変数cはint型ですよね。 ありがとうございました。
- ChateauAres
- ベストアンサー率43% (64/148)
sample.txtと結果を示した方が良いですね。 #2さんも指摘されてますが printf("a"); //確認用 の意図が全く理解できません。何のためにしているのでしょう?
お礼
if文のisupperでひっかかってるかどうか確認するために打ってみました^^;
補足
if((fp4 = fopen("sample.txt","r")) == NULL){ printf("can't open\n"); } else{ while((c=fgetc(fp4)) != EOF){ if(isupper(c)){ c = tolower(c); } } printf("%c",c); } } いろいろ改良した結果結局これになりました…ができません。 cはint型でOKですよね? 警告 W8004 report.c 77: 'd' に代入した値は使われていない(関数 main ) と出ます(|| ゜Д゜)
- tatsu99
- ベストアンサー率52% (391/751)
まず問題点の切り分けを行いましょう。 以下のプログラムを実行してください。 #include <stdio.h> #include <ctype.h> int main(void) { int c = 'A'; printf ("元の値=%c\n",c); if (isupper(c)){ printf("大文字である\n"); c = tolower(c); printf ("変換後の値=%c\n",c); }else{ printf("大文字でない\n"); } return 0; } この結果、 元の値=A 大文字である 変換後の値=a が表示されれば、正しくctype関数が機能しています。 windows2000,ボーランドCで確認した結果は、正常に動作しています。(当方の環境) もし、これが正しく動作しないなら、 あなたの使用しているOS、コンパイラの種類を提示してください。
お礼
% gcc -o a a.c % ./a 元の値=A 大文字である 変換後の値=a % ctype関数うまくいってるみたいです。 もうすこし考えてみます・・・
- wakin
- ベストアンサー率16% (7/42)
if(isupper(c)){ c=tolower(c); printf("%c",c); } else printf("a"); //確認用 読み込んだ文字が小文字の場合は何も出力しないのですか?(確認用で"a"が出るようになってますけど) if(isupper(c)) c=tolower(c); else printf("a"); //確認用 printf("%c",c); こうでは?
お礼
読み込んだ文字が小文字の場合も出力したいんですが、 何も表示されないんでまず大文字を小文字に変える所からしようかなと。 よろしくおねがいします。
補足
CTYPEじゃないほうも作ってみました、、 何も表示されません^^; #include<stdio.h> #include<ctype.h> #define M 10 struct data{//構造体宣言 char author[100]; char title[100]; char publisher[100]; int year; }book[10],tmp; int main(void)//main関数 { FILE *fp1,*fp2,*fp3,*fp4;//ファイルの宣言 int i,j,k;//for文の時に使用 char c[5]; char d[100]; if((fp1 = fopen("biblio.txt","r")) == NULL){ printf("can't open"); return(-1);//強制終了 } else{ for(i=0;i<M;i++){ fscanf(fp1,"%[^,],%[^,],%[^,],%d%*c",book[i].author,book[i].title,book[i].publisher,&book[i].year); } } for(j=0;j<M;j++){ for(k=0;k<M;k++){ if(j<=k){//これを書かないと降順になってしまう。(j=2、k=0の時また交換されてしまう。) if(book[j].year < book[k].year){//もし発行年が次の構造体の発行年より大きかったら tmp=book[j]; book[j]=book[k]; book[k]=tmp; } } } } if((fp2 = fopen("formatted.txt","w")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ for(i=0;i<M;i++){ fprintf(fp2,"Author :%s\n Title :%s\n Publisher :%s\n Year :%d\n\n ",book[i].author,book[i].title,book[i].publisher,book[i].year); } } if((fp3 = fopen("sample.txt","w")) == NULL){ printf("can't open"); return(-1);//強制終了 } else{//タイトルだけをサンプルに書き出す for(i=0;i<M;i++){ fprintf(fp3,"%s",book[i].title); } } if((fp4 = fopen("sample.txt","r")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ while(fscanf(fp4,"%s%c",&c,&d)!=EOF){/*EOFまでfp3に入力*/ if(c[0]>=65 && c[0]<=90){/*大文字表記なら小文字表記に変換*/ c[0]+=32; printf("%s",c); } } } fclose(fp4); fclose(fp3); fclose(fp2); fclose(fp1); return(0);//正常終了 }
- ChateauAres
- ベストアンサー率43% (64/148)
printf の %s は文字列(charのポインタ)なので、 %c ではないですか?
お礼
早速回答ありがとうございます。 %cに変更してみましたが、やはりできません。 Problem Solving and Program Design in CC : A Reference ManualC Primer PlusC How to ProgramC Programming for Engineering and Computer ScienceIntroduction to CProgramming Embedded Systems in C and C++Absolute Beginner's Guide to CNumerical Recipes in C : The Art of Scientific ComputingThe C Programming Language これがsampleのなかに入ってるんですが、ctypeじゃ無理ですかね。。
補足
前の部分のソースです #include<stdio.h> #include<ctype.h> #define M 10 struct data{//構造体宣言 char author[100]; char title[100]; char publisher[100]; int year; }book[10],tmp; int main(void)//main関数 { FILE *fp1,*fp2,*fp3,*fp4,*fp5;//ファイルの宣言 int i,j,k;//for文の時に使用 int c; if((fp1 = fopen("biblio.txt","r")) == NULL){ printf("can't open"); return(-1);//強制終了 } else{ for(i=0;i<M;i++){ fscanf(fp1,"%[^,],%[^,],%[^,],%d%*c",book[i].author,book[i].title,book[i].publisher,&book[i].year); } } for(j=0;j<M;j++){ for(k=0;k<M;k++){ if(j<=k){//これを書かないと降順になってしまう。(j=2、k=0の時また交換されてしまう。) if(book[j].year < book[k].year){//もし発行年が次の構造体の発行年より大きかったら tmp=book[j]; book[j]=book[k]; book[k]=tmp; } } } } if((fp2 = fopen("formatted.txt","w")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ for(i=0;i<M;i++){ fprintf(fp2,"Author :%s\n Title :%s\n Publisher :%s\n Year :%d\n\n ",book[i].author,book[i].title,book[i].publisher,book[i].year); } } if((fp3 = fopen("sample.txt","w")) == NULL){ printf("can't open"); return(-1);//強制終了 } else{//タイトルだけをサンプルに書き出す for(i=0;i<M;i++){ fprintf(fp3,"%s",book[i].title); } }
お礼
コンパイルできました。 すぐ閉じないといけないんですね。 ためになりました。 ありがとうございました。