• ベストアンサー

fopenのコード

初歩的なことですがファイルをオープンするfopenの例題で *************************** #include<stdio.h> int main (void) {   FILE  *fp;     fp = fopen ("test1.txt","w");   if (fp==NULL) {     printf ("ファイルをオープンできませんでした。\n");     return 1;   }    else {     printf ("ファイルをオープンしました。\n");   }    fclose (fp);   printf ("ファイルをクローズしました。\n");    return  0; } *********************************というのがあります。 この中のif文の中のreturnの戻り値が1なのはなぜでしょうか? (例題によっては-1というのもありましたが・・。) またどこに戻り値を返すのでしょうか? もしファイルがオープンできなければその時点で終了になるのでしょうか?初歩的なところですがお願いします。

  • poyo3
  • お礼率66% (538/813)

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

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

>この中のif文の中のreturnの戻り値が1なのはなぜでしょうか? >(例題によっては-1というのもありましたが・・。) 正常終了(0)と区別したい、というくらいの意味で、0以外ならば いくつでもよいです。 >またどこに戻り値を返すのでしょうか? そのプログラムを実行したOS側です。 Windowsでバッチファイルの中で実行したのであれば、0とか-1とかいう戻り値によって バッチファイルのその後の動きをコントロールできます。 また、UNIX系のOSでシェルスクリプトの中で実行したのであれば、 戻り値の値によってシェルスクリプトのその後の動きをコントロールできます。 >もしファイルがオープンできなければその時点で終了になるのでしょうか? 今回の場合は、そのとおりです。 ファイルをオープンできなかった場合、main関数を(戻り値1、前述のとおり0と区別できればよい)で終了しているためです。

poyo3
質問者

お礼

そういうことなんですね。回答ありがとうございます。

その他の回答 (3)

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.4

mainからの戻り値は、バッチファイルで使えます。 質問文のプログラムを「userprog.exe」と言う名前で作成しておいてから、テキストファイルに --------- @echo off userprog.exe if ERRORLEVEL 3 goto RET3 if ERRORLEVEL 2 goto RET2 if ERRORLEVEL 1 goto RET1 echo userprogのmainが0でreturnしました。 goto END RET1: echo userprogのmainが1でreturnしました。 goto END RET2: echo userprogのmainが2でreturnしました。 goto END RET3: echo userprogのmainが3でreturnしました。 END: --------- と書いてtest.batと言う名前で「userprog.exeがある場所と同じ場所に、バッチファイルとして保存」するとWindowsのコマンドプロンプトで実行できるようになります。 コマンドプロンプトで実行すると C:\TEST>test<enter> userprogのmainが0でreturnしました。 C:\TEST> とか C:\TEST>test<enter> userprogのmainが1でreturnしました。 C:\TEST> とかって感じになり「プログラムの実行結果によって、違う処理を続ける」ことが出来ます。

poyo3
質問者

お礼

難しいですね。そういう方法もあるのですか。回答ありがとうございます。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

Windowsとかunix系OSだとmain関数の戻り値が、プロセスの戻り値になります。 普段あまり意識されることはありませんが、バッチファイルを作ったり、子プロセスとして起動されるような場合には、重要になることがあります。 プロセスの戻り値としては、0~255までしか有効でない場合が多いので、main関数の戻り値も、0~255までにする習慣にしといたほうが無難かと思います。 例えば、256なんて値を返そうとすると、0になってしまいますので、要注意ですね。

poyo3
質問者

お礼

なるほど。main関数の戻り値はあまり気にしてないですね。回答ありがとうございます。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

stdlib.hに #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 と定義されていたりするのでこれを使うこともあります return EXIT_FAILURE; return EXIT_SUCCESS;

poyo3
質問者

お礼

そういうのもあるのですか。複雑ですね。回答ありがとうございます。

関連するQ&A

  • fopen関数について

    ----------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char filename[80],ss[256]; printf("ファイル名="); gets(filename); if((fp=fopen(filename,"r"))==NULL){ printf("ファイルをオープンできません.\n"); exit(1); } while(fgets(ss,256,fp)!=NULL){ printf("%s",ss); } puts(""); fclose(fp); return 0; } ----------------------------------------- 初心者な内容の質問ですいません。 以上のプログラムでまず、「gets(filename);」により、「filename[80]」の配列に「aaa.txt」という文字列を格納し、そのファイルをfopenで読もう込もうとしています。 そこで、 if((fp=fopen(filename,"r"))==NULL) の部分に疑問があるのですが、「filename」という配列名だけで中身の「aaa.txt」と何故認識できるのでしょうか? 配列名ということで、先頭アドレスのみの情報しかないと思いました。 教えていただければ嬉しいです。

  • C言語 fopen

    初心者の質問になります。現在ファイルがオープンできるかどうかを確認したいのですが、指定したディレクトリの中のファイルを指定しているのですが、オープンできませんという結果が返ってきます。同じ場所にファイルを置いてファイル名だけでしていするとオープンが出来ます。 何卒よろしくおねがいします。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { FILE *fp; char *filename = "/file/d20151001.csv"; fp = fopen(filename,"r"); if (fp == NULL) { printf("\aファイルをオープンできません\n"); } else { printf("ファイルがオープンできました\n"); fclose(fp); } return (0); } ディレクトリ(わかりにくくてすいません汗) file------d20151001.csv data.c 環境 VisualStudio

  • C言語 iMacでのファイル入出力

    #include <stdio.h> int main() { FILE *fp; fp=fopen("test.txt","w"); if (fp==NULL){ perror("ファイル・オープンに失敗しました\n"); return -1; }else printf("ファイルを正常に開きました\n"); fprintf(fp,"これが初めてのファイル入出力です\n"); if (fclose(fp)!=0){ perror("ファイル・クローズに失敗しました\n"); return -1; }else printf("ファイルを正常に閉じました\n"); return 0; } これを実行してもどこにもtest.txtというファイルがありません。 同じプログラムをwinでも実行してみたところ正常にファイルが作られました。 mac初心者なもんで、どうすればいいのでしょうか?

  • C言語のファイル読み込みに関して。

    英文を入力したテキストファイルを読み込むプログラムをつくっているのですが、 ファイル読み込みが上手くできません。 #include<stdio.h> main() { char filename[33]; char sty[512]; FILE *fp; printf("FILENAME: "); fgets(filename, 33, stdin); //読み込むテキストファイルを指定 fp = fopen(filename,"r"); if(fp == NULL){ printf("Can't open the file!\n"); return -1; } fgets(sty, 512, fp); fclose(fp); printf("%s\n",sty); } このプログラムなのですが、どうしても"Can't open the file!"が表示されてしまいます。 どうすればいいのでしょうか?

  • C言語でCSVファイルのオープン・クローズができな

    C言語でCSVファイルのオープン・クローズができない。 下記のプログラムですが、CSVファイルが読み込めません。 どのようにすれば読み込めるのでしょうか。よろしくお願いいたします。 #include <stdio.h> int main(void) { FILE *fp; fp = fopen("aaa.csv","r"); if (fp == NULL) printf("ファイルを開けません。"); else { fclose(fp); } return(0); }

  • txtファイルが作成されない

     こんにちは。  C言語初心者で、C言語の勉強をしています。  Visual C++ 2005 Express Editionで、  下記のようなプログラミングをし、kus.txtファイルを   作成しようとしました。  #include <stdio.h> int main(void) { FILE *fp; fp = fopen("kus.txt", "w"); if(fp == NULL){ printf("ファイルオープン失敗\n"); return 1; } else{ printf("ファイルオープン成功\n"); } fclose(fp); printf("ファイル閉じる\n"); return 0; }  そしてこれをソリューションのリビルトをし、  エラー0、警告1とでて、無事にビルトできましたが、  この後コマンドプロンプトで、   このプログラムを実行したところ、  ファイルオープン成功  ファイル閉じる  という言葉はしっかりでてきたのですが、  肝心のkus.txtが、画面のどこにもでてきません。  なぜでしょうか。教えてください。  

  • ファイルから一文字ずつ読み込む

    ファイルを読み込むfgetc()関数のところでプログラムが停止します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char name[],int a){ printf("ファイル名を入力してください。\n"); scanf("%s",name); } void open(FILE *fp2,char name[]){ if((fp2=fopen(name,"r"))==NULL){ printf("ファイルオープンエラー"); } } int count(FILE *fp3){ int ch=0; int count=0; if(fp3==NULL){ printf("error"); } while((ch=fgetc(fp3))!=EOF){ if(ch=='\n'){ count++; } } printf("TEST"); fclose(fp3); return(count); } int main (void){ FILE *fp; char fname[30]; get_name(fname,30); open(fp,fname); printf("%d",count(fp)); return(0);} ファイル名を入力してください。ファイル名を入力、プログラム停止です。 '\n'を数えれるようにしてください。御指摘お願いします。

  • ファイルクローズ(fclose)でエラーを発生させる方法

    ソースには一切手を加えず、(5)ファイルのクローズでエラー表示させる方法はないでしょうか。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; /* (1)ファイルポインタの宣言 */ char s[256]; /* (2)ファイルのオープン */ /* ここで、ファイルポインタを取得する */ if ((fp = fopen("smpl.txt", "r")) == NULL) { printf("file open error!!\n"); exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */ } /* (4)ファイルの読み(書き)*/ while (fgets(s, 256, fp) != NULL) { /* ここではfgets()により1行単位で読み出し */ printf("%s", s); } if((fclose(fp)) == EOF){ /* (5)ファイルのクローズ */ Logging(cfancname, 2); printf("ファイルクローズに失敗しました\n"); return -1; } return 0; } 宜しくお願いします。

  • 「コマンドライン引数チェック」て何

    #include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; char gyou[1024]; int gyousuu = 0; if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } fp = fopen(argv[1], "r"); if ( fp == NULL ){ printf("fopen dekinai\n"); return -2; } while(fgets(gyou, sizeof(gyou), fp) != NULL){ gyousuu++; } fclose(fp); printf("gyousuu=%d\n", gyousuu); return 0; }    以上のプログラムはご覧のとおり、「ファイルの行数を計算」のプログラムです。 さて以上の  if ( argc < 2 ){ printf("file mei ga nai\n"); return -1; } は「コマンドライン引数チェック」を行っています。・・・  if ( argc < 2 ){の「argcは2以上である必要がある」と参考書に書いてあります。   以上ですが意味が日光手前ですが、プログラムの行数をカウントするうえで、  「コマンドライン引数チェック」とはどんな作業を行っているとこなのでしょうか!?  よろしくお願いします。  

  • どうやってフローチャートを書きますか

    #include<stdio.h>   void main()   {   FILE*fp;   char buf[128];   char *rc;   char fname[20];   do{   printf("file name>>>");   scanf("%s",fname);   fp=fopen(fname,"r");   if=(fp==NULL) printf("File Open Err¥n");   }while(fp==NULL);   rc=fgets(buf,128,fp);   while(rc!=NULL){    printf("%s",buf);    rc=fgets(buf,123,fp);    }    fclose(fp);    }

専門家に質問してみよう