• ベストアンサー

文字の後の*の意味

C言語初心者です。 あるプログラムの中で FILE* fopenread(const char* filename)・・・・(A) {FILE* file = fopen(filename, "r");・・・・・(B) if (file==NULL) {fprintf(stderr, "cannot open %s\n", filename); exit(-2);}・・・・(C) return file; } という関数があるのですが これはいったい何をしているのかがわかりません。 1. (A)は「FILE* fopenreadという名前の関数を定義し、 その引数が定数でchar型のfilenameという名前」ということでしょうか?たとえば適当な文字pを用いて「*p」のような表記ならば 「ポインタを使いますってことを言ってるんだな」ってことはわかるのですがここでは文字の後に*がついてます。これは何なのでしょうか?? 2.(B)はfilenameという名前のファイルを読み込みを目的として開く。FILE* file という変数に入れる。 3.(C)ファイルの中身がない場合は、cannot open と標準エラー出力に表示する。exit(-2);っていうのは何でしょうか??? 基本的なことばかりかもしれませんが自分なりに調べてもよくわからなかったので、 詳しい方、アドバイスしていただければと思います。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

1. const char* filename と const char *filename は同じ意味です 2. fopen() のマニュアルを参照して下さい。 3. ファイルの中身がない場合に fopen() が失敗するわけではありません。 こちらもマニュアル参照。 exit(-2) の意図は不明です。 関数内でファイルのオープンに失敗すると、プログラム自体が終了してしまいます。 普通そんなことはしません。 >自分なりに調べてもよくわからなかったので、 ついでにどう調べたのかも補足に書くとよいでしょう。

lordofroom
質問者

補足

ありがとうございます! 1.はそうだったのですね。本当に助かりました。ここが一番わからなかったので・・・。 調べたのは"http://www9.plala.or.jp/sgwr-t/"で探しました。 17章のファイル入出力のところが参考になりました。 基本的にこのサイトとGoogle検索によって調べています。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

>#2さん >> 関数内でファイルのオープンに失敗すると、プログラム自体が終了してしまいます。 > > そんなことない。 いえいえ。 質問者さんのソースではオープン失敗時にexit()を呼び出していますので、 exit()の機能どおり、プログラムが終了します。 別のexit()の話をされていますか?

lordofroom
質問者

お礼

exitってよくわからないです(汗)。

回答No.2

> 関数内でファイルのオープンに失敗すると、プログラム自体が終了してしまいます。  そんなことない。 > 普通そんなことはしません。  返り値で失敗を知らせるか、"exit"するのが普通。  

lordofroom
質問者

お礼

それは知りませんでした。ありがとうございます!!

関連するQ&A

  • fgetcの返却値 EOFについて

    C言語について質問です。あまり詳しくないので言葉や、説明等間違っているところが あり読みにくいと思います。 fgetc関数の返却値についてのお伺いします。 EOFはファイルの終わり又は、読み込みが失敗すると、返却されるとあります。 ここで、質問なのですが、2つの違いを判断することは可能でしょうか? 私が行った作業は あるファイル内の文字を1文字づつ読み込んで。 文字の種類ごとに指定したbufferferに格納させたいと思っています。 しかし、ファイル内の終端がEOFで終る場合に読み込みエラーの場合と、読み込み終了で 場合分けができない為うまくできません。 #include <stdio.h> #include <ctype.h> char buffer[100]; char *filename="TestFile"; char* main(){ static FILE *fp = NULL; char *p = buffer; int c; if ( fp == NULL ){ if ((fp = fopen( filename, "r" )) == NULL ){ fprintf(stderr,"can not open file %s\n", filename); return ( (char *)NULL ); } } c = fgetc(fp); while(1){ switch(c){ case '\n': case '\0': *p = '\0'; return( buffer); /*以下のcase EOF の時に2通り考えられる*/ case EOF:/*読み込み終了*/ *p = '\0'; return( buffer); /* case EOF:/*読み込みエラー fprintf(stderr, " OPEN _ERROR %s\n", filename); fclose(fp); fp = NULL; return ( (char *)NULL ); */ default: *p = (char)c; p++; } c = fgetc(fp); } } 以上です。 このような場合どうしたらよいのでしょうか?また異なるやり方があればご教授お願いします。 よろしくお願いします。

  • ファイルをオープンするときのエラー

    C言語であるファイルにある数値を100ごとに合計して,ほかのファイルに書き出す。しかし,実行するとエラーでてきます。原因はわからないです。因みに,オープンしたいファイルをほかのディレクリに置いたら,ファイルが見付かりませんとのエラーがありました、WindowsのC言語でカレントディレクトリを探すときは何の関数を使えばいいでしょうか? int main(void) { int i,k; int num; char filename[64],fileread[64],filewrite[64]; FILE *fp0,*fp1; double sum1,sum2,sum3; int *ch[3]; sum1=sum2=sum3=0.0; printf("ファイル名を入力ください!\n"); scanf("%s",filename); fprintf(stderr,"\n%s\n",filename); sprintf(fileread,"C:\\%s.txt",filename); fprintf(stderr,"%s\n",fileread); sprintf(filewrite,"C:\\%s.csv",filename); for (i=0;i<3;i++) { if ( (ch[i]=(int *)malloc(4*30))==NULL ) { fprintf(stderr,"Cannot get memory <ch[%d]>.",i); return -1; } } fprintf(stderr,"%s\n",filewrite); if ((fp0=fopen(fileread,"rb"))==NULL) { fprintf(stderr,"Cannot open file %s\n",fileread); return 0; } fscanf(fp0,"%d", &num); if((fp1=fopen(filewrite,"wb"))==NULL) { fprintf(stderr,"Cannot open file!%s\n",filewrite); return 0; } for(i=0;i<50;i++) { fscanf(fp0,"%d %d %d",*(ch[0]),*(ch[1]),*(ch[2])); } for(i=0;i<num/100;i++) { for (k=0;k<100;k++) { fscanf(fp0,"%d %d %d",*(ch[0]),*(ch[1]),*(ch[2])); if ( feof(fp0) != 0 ) break; sum1=sum1+*(ch[0]); sum2=sum2+*(ch[1]); sum3=sum3+*(ch[2]); } fprintf(fp1,"%d %d %d\n",sum1,sum2,sum3); } fclose(fp0); fclose(fp1); return 0; }

  • C言語の質問です

    #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fpi, *fpo; unsigned char idat; /* 引数のチェック */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* 入力画像のオープン */ if((fpi=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "input file open error\n"); exit(1); } /* 出力画像のオープン */ if((fpo=fopen(argv[2], "wb")) == NULL){ fprintf(stderr, "output file open error\n"); exit(1); } /* 入力画像の読込み */ while (fread(&idat, sizeof(unsigned char), 1, fpi) == 1){ /* 2倍の変換 */ if (idat * 2 > 255) { idat = 255; } else { idat = idat * 2; } /* 変換データの書出し */ if(fwrite(&idat, sizeof(unsigned char), 1, fpo) != 1){ fprintf(stderr, "data write error\n"); exit(1); } } fclose(fpi); fclose(fpo); return (0); } このプログラムをグレースケール化のプログラムに修正してください お願いします

  • c言語に関する質問です

    こんにちは。 私はとある大学の機械工学科の学生です。 先日プログラミングの授業で課題が出されたのですが、さっぱりわかりません。 目的を達成するために、下のプログラム(使ってるものはC++)の間違いを2か所訂正しなさいというものです。 どこをどう直せばいいのか教えてください。 一番左の数字は、ここで指摘しやすくするための行数です。 1 #include <stdio.h> 2 #include <stdlio.h> 3 // 計算処理をするための関数 4 void operation(FILE* ifp,FILE* ofp) 5 { 6 const int LOOPLIMIT = 10000; //ループ最大回数を規定。エラー対策 7 8 if((ifp==NULL)||(ofp==NULL)){//ファイルポインタのエラー処理 9      fprintf(stderr,"[ERROR]null file poimter detected.\n); 10      exit(-1); 11     } 12 13 for(int i=0;i<LOOPLIMIT;i++){//入力ファイルは1万行までサポート 14 if(fscanf(ifp,"%f%f",&a,&b) == EOF) //入力ファイルから数値2個読み込み 15 break;//読み込めなかったら処理を終了 16 float c = a*b; 17 fprintf(ofp,"%g,%g,%g\n",a,b,c); 18   } 19} 20 // メイン関数 21 int main(int argc,char* argv[]) 22 { 23 FILE* ifp = NULL; //入力用ファイルポインタ 24 FILE* ofp = NULL; //出力用ファイルポインタ 25 char* ifile = NULL; //入力ファイル名 26 char* ofile = NULL; //出力ファイル名 27 28 if(argc!=3){ 29 fprintf(stderr,"Usage:%s inputfile outputfile\n,argv[0]); 30 exit(1); 31 } 32 33 ifile = argv[1]; //パラメータの1番目を入力ファイル名 34 ofile = argv[2]; //パラメータの2番目を出力ファイル名 35 36 if((ifp = fopen(ifile,"rt"))==NULL{ //入力ファイルを開く 37 fprintf(stderr,"Can't open file %s\a\n",ifile); //開けなかったら終了 38 exit(2); 39 } 40 if((ifp = fopen(ofile,"wt"))==NULL{ //出力ファイルを開く 41 fprintf(stderr,"Can't open file %s\a\n",ofile); //開けなかったら終了 42 exit(3); 43 } 44 45 operation(ifp,ofp); 46 47 fclose(ofp); 48 fclose(ifp); 49 return(0); 50 } 入力ファイル例(inputdata.txt) 147 0.369 258 0.147 369 0.258 ファイル出力結果の例(outputdata.csv) 147, 0.369, 54.243 258, 0.147, 37.926 369, 0.258, 95.202 画面出力結果の例 147 x 0.369 = 54.243 258 x 0.147 = 37.926 369 x 0.258 = 95.202 ご面倒かもしれませんが、お願いいたします。

  • ファイルから読み込んだ文字を

    ファイルから読み込んだ全角文字をあるキーワード(例えば"田中")が含んでいるか否かを判定するプログラムをつくりたいのですが、なかなか上手くいきません。ファイルをopenし中の文字を読込み、それを変数に格納、ifでeq使って判定したのですが、全角は判定してくれません。全角を判定するには一体どうしたら良いのでしょうか? $filename = "####.txt"; open( $fh, "< $filename" ) #ファイルopen or die "Cannot open $file: $!"; $key = 'キ'; #キーワードを決めて while ($c = getc $fh ) { #比較する if($c eq $key){ print "キーワードを見付けました。"; } } close(fh); getcだとおそらく全角は文字コードを読み込んでしまうような感じでしょうか?print $c "\n";とすると文字化けします。しかし、printf("%d", $c);だと何も表示してくれません。これはord関数を使わねばならないのでしょうか?それとも別な方法が?等などためしたのですが、もう分かりません。 御指導御鞭撻をよろしくお願いします。

  • pgm画像入出力(C言語)

    画像入出力のプログラムを書いた(とあるサイトからパクった)のですが、出力画像のテキストデータが文字化けしてしまいます。原因究明お願いします。このプログラムでは2倍に変換していますが、そこは重要ではなく、入出力さえできればいいです。 OS:windows 文字コード:色々試したけどダメ。試してないものもあるかも。 プログラム #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fpi, *fpo; unsigned char idat; /* 引数のチェック */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* 入力画像のオープン */ if((fpi=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "input file open error\n"); exit(1); } /* 出力画像のオープン */ if((fpo=fopen(argv[2], "wb")) == NULL){ fprintf(stderr, "output file open error\n"); exit(1); } /* 入力画像の読込み */ while (fread(&idat, sizeof(unsigned char), 1, fpi) == 1){ /* 2倍の変換 */ if (idat * 2 > 255) { idat = 255; } else { idat = idat * 2; } /* 変換データの書出し */ if(fwrite(&idat, sizeof(unsigned char), 1, fpo) != 1){ fprintf(stderr, "data write error\n"); exit(1); } } fclose(fpi); fclose(fpo); return (0); } コンパイル方法(cygwin) ./a 入力画像.pgm 出力画像.pgm

  • c言語で任意のファイルから読み込んだ単語の数をカウントする

    c言語で任意のファイルから読み込んだ単語の数をカウントする 任意のファイルを読み込んだプログラムに、読み込んだ単語の数をカウントするプログラムを追加する課題が出ました。 条件は単語は空白で区切って1単語とする。改行も考慮に入れる。 関数を定義してポインタを使うらしいのですが検討がつきません。 下のプログラムでファイルを読み込むところまでは出来ています。 どうかご教授おねがいします;; #include <stdio.h> int main(int argc, char *argv[]) { FILE *myFile; int i=0,c; if(argc < 2) { fprintf(stderr,"alice.txt is required\n"); return 1; } myFile=fopen(argv[1],"r"); if(myFile==NULL) { fprintf(stderr,"Cannot open; %s\n",argv[1]); } while ((c=fgetc(myFile)) !=EOF) { fprintf(stderr,"%c",c); } fclose(myFile); return 0; }

  • C言語に関する質問です。

    以下のプログラムはどこか間違っていますか?エラーが出ます。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー エラー csvyomikomi.c: In function ‘main’: csvyomikomi.c:10:5: warning: assignment makes pointer from integer without a cast [enabled by default] fp = fileopen(filename,"r"); ^ /tmp/ccMQWsTE.o: 関数 `main' 内: csvyomikomi.c:(.text+0x21): `fileopen' に対する定義されていない参照です csvyomikomi.c:(.text+0x8d): `fileclose' に対する定義されていない参照です collect2: error: ld returned 1 exit status ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ソース #include <stdio.h> #include <stdlib.h> int main(void){ int a,b,c; char *filename="data01.dat"; FILE *fp; fp = fileopen(filename,"r"); if (fp == NULL){ fprintf(stderr,"%sのオープンに失敗しました。\n",filename); exit(1); } //csvファイルの読み込み fscanf(fp,"%d,%d,%d",&a,&b,&c); fileclose(fp); printf("%d,%d,%d\n",a,b,c); return 0; }

  • fprintfで出力するファイルのパス指定について

    cで以下のコードを書いています。 file.txtを任意の場所に作りたいのですが どうすればいいのでしょうか。 fopen("c:\file.txt", "r"))と書くとエラーになって しまいました。 void main(void) { FILE *fp; if ((fp = fopen("file.txt", "r")) == NULL) { fprintf ( stderr, "err\n" ); exit (2); } fprintf(fp,"%s\n",a);; fclose(fp); }

  • popenについて質問です!!

    こんにちは!遺伝的アルゴリズムを用いた回路の最適化について研究をしているものですが…プログラムに問題がありまして質問させていただきました。 たぶん、popenの使い方の問題だと思いますが…下のプログラムを見るとこういう部分があります。↓↓ ----------------------------------------------- if(!(p_file=popen(command,"r"))){ printf(" cannot open a pipe!!"); exit(1); } ----------------------------------------------- プログラムを動かすと何世代かは回りますが、ある世代で急にifのループに入ってしまってプログラムが止まってしまうのですが…なぜでしょうか? これってpopenの使い方が間違ってるんでしょかね? でも、約20世代までは何の問題もなく動きます。で、急にifのループに入ってしまって止まるのです。 どなたかお分かりの方がいらっしゃれば是非教えてください。よろしくお願いいたします。 ------------------------------------------- . . . . char command[100],field[81]; for(rua=0; rua<N; rua++){ for(rub=0; rub<N; rub++){ char *bp; FILE *p_file,*net_fp,*fp_outfile; net_fp=fopen("bpf.net","w"); . . . . fclose (net_fp); sprintf(command,"%s",COMMAND); if(!(p_file=popen(command,"r"))){ printf(" cannot open a pipe!!"); exit(1); } if(!(fp_outfile=fopen("bpf.out","r"))){ printf(" cannot open a output file!!"); exit(1); } . . . . pclose(p_file); . . . .