キーボードから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では動作しません。
ありがとうございました。ファイルを閉じると、fclose()の使用方法を知りました。 – Cristi
ファイルを正常に閉じますが、** printf( "function():step2:feof(g)=%d \ n"、feof(g))の後に**何もしません。 – Cristi
@ user1187554:あなたは 'printf()function():step2:feof(g)=%d \ n"、feof(g)); 'に続くfread()呼び出しで間違ったファイルポインタを使用しました。あなたは 'f'を使っていますが、' g'でなければなりません。 – tinman