• ベストアンサー

0バイトのファイルを検知したい。

ファイル上のデータを読み出して、メモリ上に一時保管する過程で、読み出しファイルのデータが0バイトであった時にエラーメッセージを表示させたいのですが、何で検知できるのでしょうか。C言語でつくっています。 ちなみに今はこんな感じになっているんですが・・・・・・ /** データを入力 **/ if(fgets(buf,sizeof(buf), fin) == NULL){    /** 売上表ファイル入力 **/    if(ferror(fin) != 0){ /** エラー時 **/       printf(ERR_MSG,SORT,URI_FIL,uriage_file);    }else{       i_ret = 0; /** 読み込み終了時 **/    }

noname#5848
noname#5848

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

stat() 関数が使えそうです。 stat() は、ファイルパスを指定して、そのファイルの属性を情報用の構造体に 詰め込んでくれます。 その構造体のメンバには st_size というのがあり、ファイルサイズが入って います。 サイズが0であることを検出するのであれば、fopen() の前に stat() で ファイルサイズを確認してしまえば OK ですね。 詳しくは、マニュアルを見てください。

noname#5848
質問者

お礼

ありがとございます。 マニュアルを頑張って読んでやってみます!

その他の回答 (1)

  • selenity
  • ベストアンサー率41% (324/772)
回答No.2

基本は 1)fopenで開いたファイルストリームを、fseekで末尾に移動 2)ftellで現在の位置(末尾)を取得 でファイルサイズが分かります。 その後、再度fssekでファイルストリームを先頭に戻し、通常作業を行います。

noname#5848
質問者

お礼

いろんなやり方があるんですね。 その方法もしてみて、両方試したいと思います。 ありがとうございました。

関連するQ&A

  • fgets( ) の返り値は何?

    fgets( ) はファイル終端に行くと0を返すらしいけど それ以外の場合は何を返すんですか? if( fgets( buf, 10, fp ) == 0 ) break; のように、fgets( ) の返り値をそのまま使うことはできたけど 試しに、 char ret[255]; ret = fgets(buf, 10, fp); とするとコンパイルエラーでした。

  • ファイルが開かない

    こんにちは、最近C言語の入門書を読み とあるプログラムをつくったのですが、思ったようになりません。 そのプログラムは typ1 という名前でこのようになっています。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; char buf[256]; char filename[80]; printf("入力ファイル名を指定してください="); gets(filename); fin = fopen("filename", "r"); if(fin == NULL) { printf("%sをオープンできません\n", filename); exit(1); } while(fgets(buf, 256, fin) != NULL){ printf("%s", buf); } fclose(fin); return 0; } となっており、プログラムを起動して指定したファイルを読み込んで、その内容を画面に出力するというものです。読み込み用ファイル(名前はsmp1)はメモ帳でつくっており、内容はアルファベットを一行目に、1から9の数字を二行目に書いて、アプリケーションのtyp1.exeがあるDebugというディレクトリと同じ場所に保存しております。 このプログラムはVisual Studio net 2003で作っおり エラー等はなく正常に動くのですが読み込むファイル(この場合smp1)を指定しても 入力ファイル名を指定してください=smp1.txt smp1.txtをオープンできません。 Press any key to continue となってしまいます。  読み込み用ファイルの場所が適切ではないのでしょうか? どなたか教えてください。

  • ポインターにポインターを加えようとしました。のエラーについて

    よろしくお願いします。環境 WIN98 VC++6.0 MFC にて 下記において、 //m_InputData=m_InputData+buf+crlf;では問題無いのに、m_InputData=buf+crlf;にするとポインターにポインターを加えようとしました。とエラーが出ます。 どうしてなのでしょう? また、対処方法はどうすれば良いのでしょうか? ************************* void CInput::OnButton4() //読出し { int n; char buf[256]; char crlf[]="\x0d\x0a"; FILE *fin; UpdateData(TRUE); m_InputData=""; if((fin=fopen("d:\\qqq.txt","r"))==NULL){ AfxMessageBox("読み込みファイルオープン出来ません"); return; } while((fgets(buf,256,fin))!=NULL){ n=strlen(buf); buf[n-1]='\0'; //AfxMessageBox(m_text); //m_InputData=m_InputData+buf+crlf;//問題無し m_InputData=buf+crlf;//エラー } fclose(fin); UpdateData(FALSE); }

  • このプログラムの解説を

    C言語の勉強を始めたのですが、質問があります。 下のプログラムをコンパイルしたら   入力ファイル名= と出ますが、これは何を入力すればよいのでしょうか? 何か入力しても「~がオープンできません」と表示されて、これは、自分が持っているファイルを打てばよいのですか?(このプログラム自体も何を意味しているか、まだ理解できていません。) 解説よろしくお願いします。 #include<stdio.h> #include<stdlib.h> main() { FILE *fin; char buf[256]; char filename1[20]; printf("入力ファイル名="); gets(filename1); fin=fopen(filename1,"r"); if(fin==NULL){ printf("%sがオープンできません.\n",filename1); exit(1); } while(fgets(buf,256,fin) !=NULL){ printf("%s",buf); } fclose(fin); }

  • 一度に2個づつのデータを取得するには?

    お願いします。環境 WIN98 VC++6.0 MFC にて 今、下記のようにファイルから文字データを1行づつ読出して、ウィンドウを生成し読み出した文字を表示しています。 今度はデータを表示文字だけではなく、 1行目:ウィンドウ位置データ(とりあえず左上のみ)、 2行目:表示文字データ ・ ・ というように、位置データと文字データの繰り返しのデータにしました。 そこで2行づつ読み出すたびに、ウィンドウを1個作成するようにしたいのですが、スマートな方法はないでしょうか? if((fin=fopen("d:\\qqq.txt","r"))==NULL){ AfxMessageBox("読み込みファイルオープン出来ません"); return; } while((fgets(buf,256,fin))!=NULL) { n=strlen(buf); buf[n-1]='\0'; pWnd = new CMyWnd(this); pWnd->m_moji=buf; m_pAryDlg.Add ( pWnd ); m_pAryDlg2.Add ( &buf ); }

  • ファイル

    ファイルを読み込み単語ごとに表示するプログラムです。 例 ファイル データ 形式 歴史・・ のように単語の後には空白がありますファイルです FILE *fp; char buf[1000]; char buf_word[1000]; char *str; char *bufstr; if((fp = fopen("test.txt","r")) == NULL){ printf("error!"); return 0; } while(fgets(buf,1000,fp) !=NULL){ str = buf; while(*str !='\0'){ strbuf = buf_word; if(*str ==' '){ printf("%s",buf_word); } else{ *strbuf++ = *str++; } } } とプログラムしてみましたが*strの値がどうもおかしく 最初が "フ" じゃなく"・"になってます。 最初の単語がG11とかなら"G"になっていますが・・ 教えて下さい。

  • fgetsとsscanf

    C言語の勉強をしております。 初歩的な質問なのかもしれないですが、 char buf[80]; char data[32]; fgets(buf,sizeof(buf),stdin); sscanf(data, "%s", buf); と、 fgets(data, sizeof(buf), stdin); は何が違うのでしょう? 他の質問内容やネットで探してみたんですが、基本的には組み合わせて使用されているみたいなんですが、必要性がわかりません・・・。 例えば、fgetsで構造体のメンバ(文字配列)へキーボードからデータを入力したい場合は、どちらで行うのが良いのでしょう? また、入力データが未入力かどうか判断させるには、 fgets(buf,sizeof(buf),stdin); if(buffer[0] == '\n'){   /* ループを抜ける */   break; } で良いですよね? ※関連している質問 http://oshiete1.goo.ne.jp/qa4438371.html あと、同じ処理内で、getsやscanfを混同して使用すると、どこかの入力時に改行がバッファに残ってしまい、入力処理が飛ばされてしまいますか? 以上、よろしくお願いいたします。

  • gccのオプションは必要ですか?

    ubuntuを使ってc言語の勉強(スーパービギナー編ですが)をしています。 以下のプログラムを実行すると、Segmentation faultが出ます。 以前、-lmのオプションを付けないと、math.hが使えない事が、ありましたが、今回の場合、何か必要でしょうか? #include<stdio.h> #include<stdlib.h> int main(void) { FILE *fin; char buf[256]; char filename1[80]; printf("入力ファイル名="); gets("filename1"); fin = fopen(filename1,"r"); if(fin==NULL){ printf("%sをオープンできません。\n",filename1); exit(1); } while(fgets(buf,256,fin) !=NULL){ printf("%s",buf); } fclose(fin); return 0; }

  • C言語のプログラミングについて教えてください

    課題で下記に示すのようなデータをファイル名を入力してのそのデータを読み込みyの最大値とそのときのxの値を表示するプログラムを作成しろと言われたのですが、僕はプログラミングが初心者でむしろ苦手でホント困ってます。だれか助けてください、お願いします! データ    x  y 0.12132 3.45355 0.12353  3.415451 . . . . . . のようにxとyの行列となっていて、その数は2000個を超えています。 自分なりにやってみたのですがデータをすべて読み込まないし、まずどのようにして、yの最大値をだし、なおかつそのxの値を表示させるのもわかんなくてホント困っています。 本末転倒になりますが、プログラムを書いていただけるとほんと助かります。よろしくお願いいたします。 ちなみにこれが自分で考えたプログラムです。とりあえず、yの値がでかいのでyの最大値だけだすつもりでやってみたけど駄目でした。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; char *list[256]; char buf[1024]; char filename1[80]; printf("入力ファイル名"); gets(filename1); fin=fopen(filename1,"r"); if (fin ==NULL) { printf("%sをオープンできません\n",filename1); exit(1); } while (fgets(buf, 1024, fin) !=NULL) { printf("%s",buf); } static float max; int x; fscanf(fin,"%f",&x); if(x>max){ max=x; printf("yの最大値=%f\n",max); } fclose(fin); }

  • ファイル入出力で

    現在ファイル入出力の項目をしているのですが、以下の内容で実行すると エラーが出てどうしても実行できません。主にどこを直せばいいのでしょうか? /* ファイルをコピーするプログラム */ #include <stdio.h> int main(void) { FILE *fin, *fout; char infile[40], outfile[40]; char str[256]; printf("コピー元ファイル = "); scanf("%39s", infile); printf("コピー先ファイル = "); scanf("%39s", outfile); if( (fin = fopen(infile, "r") ) == NULL) { printf("Input file open error.\n"); return 1; } if( (fout = fopen(outfile, "w") ) == NULL) { printf("Output file open error.\n"); fclose(fin); return 1; } while(fgets(str, sizeof(str), fin) != NULL) { fputs(str, fout); } fclose(fin); fclose(fout); return 0; } エラーは FILE 、fin, fout,NULLの未定義です。 よろしくお願いします。