dポイントプレゼントキャンペーン実施中!

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関数を使って大文字から小文字に変換したいんですがうまくいきません。

コンパイルしても確認用が反応しないんでおそらくどこか間違ってると思うんですがわかりません。

ご教授宜しくお願いします。

A 回答 (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);
    • good
    • 1
この回答へのお礼

コンパイルできました。
すぐ閉じないといけないんですね。
ためになりました。
ありがとうございました。

お礼日時:2005/07/26 10:51

変数 c の型定義が間違っているのでしょう。


見直してください。
    • good
    • 0
この回答へのお礼

変数cはint型ですよね。
ありがとうございました。

お礼日時:2005/07/26 11:14

sample.txtと結果を示した方が良いですね。



#2さんも指摘されてますが
printf("a"); //確認用
の意図が全く理解できません。何のためにしているのでしょう?

この回答への補足

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 )
と出ます(|| ゜Д゜)

補足日時:2005/07/26 00:38
    • good
    • 0
この回答へのお礼

if文のisupperでひっかかってるかどうか確認するために打ってみました^^;

お礼日時:2005/07/25 21:39

まず問題点の切り分けを行いましょう。


以下のプログラムを実行してください。
#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、コンパイラの種類を提示してください。
    • good
    • 0
この回答へのお礼

% gcc -o a a.c
% ./a
元の値=A
大文字である
変換後の値=a
%

ctype関数うまくいってるみたいです。
もうすこし考えてみます・・・

お礼日時:2005/07/25 21:36

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);//正常終了


}

補足日時:2005/07/25 21:24
    • good
    • 0
この回答へのお礼

読み込んだ文字が小文字の場合も出力したいんですが、
何も表示されないんでまず大文字を小文字に変える所からしようかなと。
よろしくおねがいします。

お礼日時:2005/07/25 21:27

printf の %s は文字列(charのポインタ)なので、


%c ではないですか?

この回答への補足

前の部分のソースです

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

補足日時:2005/07/25 20:55
    • good
    • 0
この回答へのお礼

早速回答ありがとうございます。
%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じゃ無理ですかね。。

お礼日時:2005/07/25 20:53

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