我想返回指向我从文件中读取的结构的指针(它转到另一个基本打印数据的函数。) 函数通过int sem获取(序列号-1),然后想法是将文件指针设置为我想用fseek读取的结构的开头,并简单地读取整个结构并返回指针。 (示例:如果文件中写入的结构数为5,并且我想读取第4号结构,则函数获取的sem值为3,然后使用fseek指针跳过前3个结构和函数读取并返回结构第4号)。 如果sem值为0,它可以正常工作,但当我寻找任何其他结构时,它不会那么精细。我不知道出了什么问题!救命? :)
type_seminar *file_seminars_search(int sem) {
type_seminar *temp_s = (type_seminar*) malloc(sizeof(type_seminar));
FILE *f_sem;
if ((f_sem = fopen("seminars.bin", "r")) != NULL ) {
fseek(f_sem, sem * sizeof(type_seminar), SEEK_SET);
fread(temp_s, sizeof(type_seminar), 1, f_sem);
fclose(f_sem);
return (temp_s);
} else
printf("Cannot access file. \n ");
return 0;
}
结构的定义:
typedef struct {
char s_title[A];
char s_street[B];
char s_town[C];
int max_no_teachers;
int no_applied_teachers;
} type_seminar;
如果问题出现在此处打印数据的函数:
void seminar_details(type_seminar *temp_s) {
printf(" SEMINAR TITLE : %s", temp_s->s_title);
printf(" Street: %s ", temp_s->s_street);
printf(" Town: %s", temp_s->s_town);
printf(" Max no of applied teachers: %d \n", temp_s->max_no_teachers);
printf(" No of applied teachers: %d \n", temp_s->no_applied_teachers);
}
答案 0 :(得分:1)
我觉得创建seminars.bin的方式将决定文件的读取方式。与ascii模式相比,以二进制模式打开文件可能也会有所帮助。
我使用以下函数创建了seminars.bin
void createData()
{
FILE *fcre;
type_seminar element;
int counter;
fcre = fopen("seminars.bin", "wb");
for(counter = 0; counter < 5; counter++)
{
printf("Enter type_seminar.s_title:");
scanf("%s", element.s_title);
printf("Enter type_seminar.s_street:");
scanf("%s", element.s_street);
printf("Enter type_seminar.s_town:");
scanf("%s", element.s_town);
printf("Enter type_seminar.max_no_teachers:");
scanf("%d", &element.max_no_teachers);
printf("Enter type_seminar.no_applied_teachers:");
scanf("%d", &element.no_applied_teachers);
fwrite(&element, sizeof(type_seminar), 1, fcre);
}
fclose(fcre);
}
我在原始文件中修改了几行
if ((f_sem = fopen("seminars.bin", "rb")) != NULL )
和
fread(temp_s, sizeof(type_seminar), 1, f_sem);
通过这些更改,我可以按照您预期的设计让您的代码正常工作!!
答案 1 :(得分:-1)
问题出在
return 0;
线。 因为你没有返回int。