fseek,fread并返回二进制文件函数中的指针(C)不能正常工作

时间:2013-02-07 22:42:54

标签: c pointers fread fseek

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

2 个答案:

答案 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。