Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从二进制文件读取结构_C_File Handling - Fatal编程技术网

C 从二进制文件读取结构

C 从二进制文件读取结构,c,file-handling,C,File Handling,很抱歉问了这个愚蠢的问题,但我对C还是新手 这是我的结构: struct Questions { unsigned number, correctanswer, difficulty; char question[SIZE], otg1[SIZE], otg2[SIZE], otg3[SIZE], otg4[SIZE], date[SIZE], author[SIZE]; struct Questions *next; }; 我需要将信息存储在结构指针中,同时为其每个字符串分配内存。我

很抱歉问了这个愚蠢的问题,但我对C还是新手

这是我的结构:

struct Questions

{

unsigned number, correctanswer, difficulty;

char question[SIZE], otg1[SIZE], otg2[SIZE], otg3[SIZE], otg4[SIZE], date[SIZE], author[SIZE];

struct Questions *next;
};
我需要将信息存储在结构指针中,同时为其每个字符串分配内存。我在二进制文件中用逗号分隔了字符串,因此我可以找出每个字符串的结束位置,以及下一个字符串的开始位置。我在另一个函数中打开了该文件,但我确实认为问题出在这里:

Questions *readQuestionFromBin(FILE *fp)

{

Questions *temp=NULL;
char *ptr;

temp=(Questions*)malloc(sizeof(Questions));
if(temp==NULL)
{
    printf("vtorata funkciq nqma pamet za vuprosa");
    return NULL;
}


if(fread(&temp->number,sizeof(unsigned),1,fp)!=1)
{
    return NULL;
}


ptr=(char*)malloc(SIZE*sizeof(char));
if(ptr==NULL)
{
    printf("nqma pamet za vuprosa");
    return NULL;
}
ptr=temp->question;
int i=0;
while(1)
{
    *(ptr+i)=getc(fp);
    if(*(ptr+i)==',')
    {
        *(ptr+i)='\0';
        break;
    }
    i++;
}
ptr=(char*)realloc(temp->question,sizeof(char)*(i+1));
if(ptr==NULL)
{
    printf("ima pamet za vuprosa ama ne moje da reallocne");
    return NULL;
}


ptr=(char*)malloc(SIZE*sizeof(char));
if(ptr==NULL)
{
    printf("nqma pamet za otg1");
    return NULL;
}
ptr=temp->otg1;
i=0;
while(1)
{
    *(ptr+i)=getc(fp);
    if(*(ptr+i)==',')
    {
        *(ptr+i)='\0';
        break;
    }
    i++;
}
ptr=(char*)realloc(temp->question,sizeof(char)*(i+1));
if(ptr==NULL)
{
    printf("ima pamet za otg1 ama ne moje da reallocne");
    return NULL;
}



ptr=(char*)malloc(SIZE*sizeof(char));
if(ptr==NULL)
{
    printf("nqma pamet za otg2");
    return NULL;
}
ptr=temp->otg2;
i=0;
while(1)
{
    *(ptr+i)=getc(fp);
    if(*(ptr+i)==',')
    {
        *(ptr+i)='\0';
        break;
    }
    i++;
}
ptr=(char*)realloc(temp->question,sizeof(char)*(i+1));
if(ptr==NULL)
{
    printf("ima pamet za otg2 ama ne moje da reallocne");
    return NULL;
}




ptr=(char*)malloc(SIZE*sizeof(char));
if(ptr==NULL)
{
    printf("nqma pamet za otg3");
    return NULL;
}
ptr=temp->otg3;
i=0;
while(1)
{
    *(ptr+i)=getc(fp);
    if(*(ptr+i)==',')
    {
        *(ptr+i)='\0';
        break;
    }
    i++;
}
ptr=(char*)realloc(temp->question,sizeof(char)*(i+1));
if(ptr==NULL)
{
    printf("ima pamet za otg3 ama ne moje da reallocne");
    return NULL;
}



ptr=(char*)malloc(SIZE*sizeof(char));
if(ptr==NULL)
{
    printf("nqma pamet za otg4");
    return NULL;
}
ptr=temp->otg4;
i=0;
while(1)
{
    *(ptr+i)=getc(fp);
    if(*(ptr+i)==',')
    {
        *(ptr+i)='\0';
        break;
    }
    i++;
}
ptr=(char*)realloc(temp->question,sizeof(char)*(i+1));
if(ptr==NULL)
{
    printf("ima pamet za otg4 ama ne moje da reallocne");
    return NULL;
}



if(fread(&temp->correctanswer,sizeof(unsigned),1,fp)!=1)
    return NULL;


ptr=(char*)malloc(SIZE*sizeof(char));
if(ptr==NULL)
{
    printf("nqma pamet za data");
    return NULL;
}
ptr=temp->date;
i=0;
while(1)
{
    *(ptr+i)=getc(fp);
    if(*(ptr+i)==',')
    {
        *(ptr+i)='\0';
        break;
    }
    i++;
}
ptr=(char*)realloc(temp->question,sizeof(char)*(i+1));
if(ptr==NULL)
{
    printf("ima pamet za data ama ne moje da reallocne");
    return NULL;
}



ptr=(char*)malloc(SIZE*sizeof(char));
if(ptr==NULL)
{
    printf("nqma pamet za avtor");
    return NULL;
}
ptr=temp->author;
i=0;
while(1)
{
    *(ptr+i)=getc(fp);
    if(*(ptr+i)==',')
    {
        *(ptr+i)='\0';
        break;
    }
    i++;
}
ptr=(char*)realloc(temp->question,sizeof(char)*(i+1));
if(ptr==NULL)
{
    printf("ima pamet za avtor ama ne moje da reallocne");
    return NULL;
}



if(fread(&temp->difficulty,sizeof(unsigned),1,fp)!=1)
    return NULL;


temp->next=NULL;

return temp;
}

“我确实认为问题就在这里的某个地方”。什么问题?您没有提出任何问题,也没有描述任何具体问题。这段长代码对其他人帮助您没有帮助。它没有正确读取文件,我不知道问题可能出在哪里。您的代码很难理解,其中包含一些毫无意义的内容<代码>ptr=(char*)malloc(SIZE*sizeof(char));ptr=临时->问题您是否意识到第二条语句会丢弃第一条语句的结果?我真的不知道你在那里做什么。此外,您似乎在一遍又一遍地重复相同/相似的代码-您了解函数了吗?我使用第二条语句,以便将指针设置为指向temp->question的地址。