2012-02-03 17 views
2

キーボードからELEM構造体を読み込み、ファイル(file.bin)に書き込んだ後、別のファイル(aux.bin)に一意の項目を書き込むプログラムを作ろうとしました。問題は、開いたファイルを閉じることができないということです。void function()、私は何を間違えたか教えてください。Cのバイナリファイルを閉じることができません

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef struct element{ 
    char name[80]; 
    int p; 
}ELEM; 

void clear_stdin() 
{ 
    char str[255]; 
    fgets(str,255,stdin); 
} 

int create() 
{ 
    FILE *f; 
    int d=0; 
    int c; 
    int n=0; 
    ELEM s; 
    f=fopen("file.bin","wb"); 
    if(f==NULL) 
    { 
     printf("create(): Could not open file.bin for read\n"); 
     return; 
    } 
    do{ 
    printf("Add elements to file?:\n1 - yes\n2 - no\n"); 
    scanf("%d",&c); 
    if (c==1) 
    { 
     printf("Name="); 
     clear_stdin(); 
     fgets(s.name,80,stdin); 
     printf("P="); 
     scanf("%d",&s.p); 
     fwrite(&s,sizeof(ELEM),1,f); 
     n++; 
    } 
    else 
     d=1; 
    } while(d==0); 
    fclose(f); 
    return n; 
} 

void show(int n) 
{ 
    FILE *f; 
    ELEM s; 
    int i=0; 
    if(n==0) 
     return; 
    f=fopen("file.bin","rb"); 
    while(i<n) 
    { 
     fread(&s,sizeof(ELEM),1,f); 
     puts(s.name); 
     printf("\t%d\n",s.p); 
     i++; 
    } 
    fclose(f); 
} 

int add(int n) 
{ 
    FILE *f; 
    int d=0; 
    int c; 
    ELEM s; 
    f=fopen("file.bin","ab"); 
    if(f==NULL) 
    { 
     printf("add(): Could not open file.bin for append\n"); 
     return; 
    } 
    do{ 
    printf("Add elements to file?:\n1 - yes\n2 - no\n"); 
    scanf("%d",&c); 
    if (c==1) 
    { 
     printf("Name="); 
     clear_stdin(); 
     fgets(s.name,80,stdin); 
     printf("P="); 
     scanf("%d",&s.p); 
     fwrite(&s,sizeof(ELEM),1,f); 
     n++; 
    } 
    else 
     d=1; 
    } while(d==0); 
    fclose(f); 
    return n; 
} 


void func(int n) 
{ 
    FILE *f,*g; 
    ELEM v[20],w; 
    int i=0,j,k,x=0,s,gn=0,test; 
    f=fopen("file.bin","rb"); 
    g=fopen("aux.bin","wb"); 
    if((g==NULL)||(f==NULL)) 
    { 
     if(g==NULL) 
      printf("function() : Could not open aux.bin for write\n"); 
     if(f==NULL) 
      printf("function() : Could not open file.bin for read\n"); 
     return; 
    } 
    i=0; 
    while(i<n) 
    { 
     fread(&v[i],sizeof(ELEM),1,f); 

     i++; 
    } 
    for(j=0;j<n;j++) 
    { 
     for(k=j+1;k<n;k++) 
     { 
      if(v[j].p==v[k].p) 
       x=1; 

     } 
     if(x==0) 
     { 
      s=strcmp(v[j].name,v[k].name); 
      if(s!=0) 
      { 
       fwrite(&v[j],sizeof(ELEM),1,g); 
       fread(&w,sizeof(ELEM),1,g); 

       gn++; 
      } 
     } 
     x=0; 
    } 
    test=fclose(g); 
    if(test!=0) 
     printf("function() : failed to closed file g\n"); 
    test=fclose(f); 
    if(test!=0) 
     printf("function() : failed to closed file f\n"); 
    g=fopen("aux.bin","rb"); 
    if(g==NULL) 
    { 
     printf("function() : Could not open aux.bin for read\n"); 
     return; 
    } 
    if(gn==0) 
     return; 
    i=0; 
    while(i<gn) 
    { 
     fread(&w,sizeof(ELEM),1,g); 
     puts(w.name); 
     printf("\t%d\n",w.p); 
     i++; 
    } 
    fclose(g); 
} 

int main() 
{ 
    int k=0,r,n; 
    do{ 
     printf("1 - create file\n2 - add elements to file\n3 - show elements\n4 - put unique elements in another file\n5 - exit program\n"); 
     scanf("%d",&r); 
     switch(r) 
     { 
      case 1 : n=create(); break; 
      case 2 : n=add(n); break; 
      case 3 : show(n); break; 
      case 4 : func(n); break; 
      case 5 : k=1; break; 
      default : printf("Command unrecognized!\n"); 
     } 
    } while(k==0); 
    return 0; 
} 

EDIT: は、私はそれがfread(&w,sizeof(ELEM),1,g); で凍結理由です、

aux.binが作成されなかったコードを編集したしかし、なぜそれがaux.bin作成することはできませんか? エラーメッセージは表示されませんが、プロジェクトフォルダを開くと、file.binだけが表示されます。


EDIT: すべてがにfflush(STDIN)を除いて動作しますが、私はGCCにフォームのMinGWとVisual Studioを切り替え、今では両方のファイルを作成します。私は交換しましたgets(s.name);fgets(s.name、80、stdin);


EDIT: 私は標準入力をクリアし、今では、Linuxでgccで完璧に動作機能をfflushは(標準入力)を置き換えます。 Windowsでは動作しません。

答えて

3

ファイルハンドルポインタがNULLになることを期待しているようですが、ファイルを閉じると、それは当てはまりません。 fclose()関数はそれが得るすべては、ポインタの値であり、ポインタ(タイプFILE *の引数)を取り、それは呼び出し側のポインタを変更することはできません

は注意してください。これを可能にするには、FILE **、つまりポインタへのポインタで呼び出さなければなりません。

それは(および場合のみ)場合、fclose()コールの後NULLへのポインタを設定するために、あなたの責任ですfclose()は、詳細については、0参照the manual pageを返すことによって、成功したと述べました。

+0

ありがとうございました。ファイルを閉じると、fclose()の使用方法を知りました。 – Cristi

+0

ファイルを正常に閉じますが、** printf( "function():step2:feof(g)=%d \ n"、feof(g))の後に**何もしません。 – Cristi

+0

@ user1187554:あなたは 'printf()function():step2:feof(g)=%d \ n"、feof(g)); 'に続くfread()呼び出しで間違ったファイルポインタを使用しました。あなたは 'f'を使っていますが、' g'でなければなりません。 – tinman

関連する問題