我正在尝试创建一个创建和读取二进制文件的程序,该文件包含“struct elements”;你能告诉我我做错了什么吗? 我得到错误告诉我“s”不是函数fread()中的指针......所以我声明了ELEM * s;而不是ELEM;
#include <stdio.h>
#include <stdlib.h>
typedef struct element{
char name[80];
int p;
}ELEM;
void create()
{
FILE *f;
int d=0;
char c;
ELEM *s;
f=fopen("file.bin","wb");
do{
printf("Add elements to file?: (y/n)");
fflush(stdin);
scanf("%c",&c);
if (c=='y')
{
printf("Name=");
gets((*s).name);
printf("P=");
scanf("%d",(*s).p);
fwrite(s,sizeof(ELEM),1,f);
}
} while(d==0);
fclose(f);
}
void show()
{
FILE *f;
ELEM *s;
f=fopen("file.bin","rb");
while(feof(f)!=NULL)
{
fread(s,sizeof(ELEM),1,f);
puts((*s).name);
printf("\t%d\n",(*s).p);
}
fclose(f);
}
void add()
{
FILE *f;
int d=0;
char c;
ELEM *s;
f=fopen("file.bin","ab");
do{
printf("Add elements to file?: (y/n)");
fflush(stdin);
scanf("%c",&c);
if (c=='y')
{
printf("Name=");
gets((*s).name);
printf("P=");
scanf("%d",(*s).p);
fwrite(s,sizeof(ELEM),1,f);
}
} while(d==0);
fclose(f);
}
/*void function()
{
}*/
int main()
{
int k=0,r;
do{
printf("1 - create file\n2 - add elements to fil\n3 - show elements\n4 - put unique elements in another file\n5 - exit program\n");
scanf("%d",&r);
switch(r)
{
case 1 : create(); break;
case 2 : add(); break;
case 3 : show(); break;
case 4 : printf("Function not defined!\n"); break;
case 5 : k=1; break;
default : printf("Command unrecognized!\n");
}
} while(k==0);
return 0;
}
答案 0 :(得分:3)
您声明了一个指针,但没有为其分配内存。您应该恢复为正常变量:
ELEM s;
/* ... */
fwrite(&s,sizeof(ELEM),1,f);
^
或者,在您当前的代码中,您应该这样做:
ELEM *s = calloc(1, sizeof *s);
答案 1 :(得分:0)
传递给 fwrite 的第一个参数应该是一个地址,并且您传递的地址必须有足够的内存来容纳您计划读取的对象数。
所以有两种方式:
在堆栈上创建变量:
您在堆栈上分配变量并将其地址传递给fwrite
ELEM s;
fwrite(&s,sizeof(ELEM),1,f);
或
动态内存分配:
ELEM *s;
应该分配一个等效的内存来保存您想要读取的ELEM
类型的对象。
ELEM *s = malloc(sizeof *s);
在这种情况下,请记得在使用完毕后释放内存:
free(s);
答案 2 :(得分:0)
您没有在s
函数中分配指针create
。你可能想要像
s = malloc(sizeof(*s));
memset (s, 0, sizeof(*s));
等
你真的应该学习使用gcc -Wall -g
进行编译并使用gdb
调试器。
另外,花点时间阅读一本关于用C编程的好书。
答案 3 :(得分:0)
嗯,你的问题出在scanf中。 scanf应该获得指针,因此将(*s).p
更改为&(*s).p
(或甚至&s->p
)
答案 4 :(得分:0)
您应该已经分配了指向struct ELEM的指针 假设这是C:
ELEM *s = malloc(sizeof(ELEM));
如果是C ++,只需在前面添加一个演员
ELEM *s = (ELEM*) malloc(sizeof(ELEM));