0

我想返回指向我从文件中读取的结构的指针(它转到另一个基本上只是打印数据的函数。)函数通过 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);
}
4

2 回答 2

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);

通过这些更改,我可以让您的代码按照您的预期设计工作!

于 2013-02-07T23:44:26.723 回答
-1

问题在

return 0;

线。因为你没有返回 int。

于 2013-02-07T23:01:01.340 回答