C-使用同一指针打开不同的文件

C-使用同一指针打开不同的文件,c,file,fopen,fclose,C,File,Fopen,Fclose,我试图通过许多纯文本文件检索信息,这些文件将被存储在一个适当的结构中。为了做到这一点,我使用了一个函数,该函数使用struct的成员来填充存储信息的纯文本文件的源 发布我的“测试”代码: #包括 #包括 #包括 结构元素 { 常量字符*标题; int-ok; int几乎; int nope; 整数命中率; 浮动最后一级; }; 类型定义结构元素章节; 第*章生成_数组(常量字符*源,整数*元素); int engine_start(第章*元素、字符*来源); int main() { const

我试图通过许多纯文本文件检索信息,这些文件将被存储在一个适当的结构中。为了做到这一点,我使用了一个函数,该函数使用struct的成员来填充存储信息的纯文本文件的源

发布我的“测试”代码:

#包括
#包括
#包括
结构元素
{
常量字符*标题;
int-ok;
int几乎;
int nope;
整数命中率;
浮动最后一级;
};
类型定义结构元素章节;
第*章生成_数组(常量字符*源,整数*元素);
int engine_start(第章*元素、字符*来源);
int main()
{
const char path_f[100];
int元素=0;
int i=0;
第*章口述;
printf(“插入源的名称:\n”);
scanf(“%s”,路径f);
printf(“\n生成词典,请稍候…\n”);
dict=生成数组(路径和元素);
if(dict==NULL)
{
printf(“正在中止。\n”);
出口(1);
}
而(i<元素)
{
printf(“元素%d:\n”,(i+1));
printf(“\n标题:%s\n”,dict[i].标题);
printf(“确定:%10d\n”,dict[i].Ok);
printf(“几乎:%5d\n”,dict[i]。几乎);
printf(“Nope:%8d\n”,dict[i].Nope);
printf(“命中数:%8d\n”,dict[i]。命中数);
printf(“秩:%8.2f\n”,dict[i]。最后一个秩);
printf(“\n”);
i++;
}
返回退出成功;
}
第*章生成数组(常量字符*源,整数*元素)
{
文件*src;
int源;
int i=0;
字符**src;
第*章产生;
src=fopen(来源,“r”);
如果(src==NULL)
{
printf(“[!!]读取文件时出错!\n”);
返回NULL;
}
fscanf(src、%d、&sources);
if(源标题,100,解析器);
fscanf(解析器,“%d%d%d%d%f”,&(元素->确定),&(元素->几乎),
&(元素->否),&(元素->命中),
&(元素->最后等级);
fclose(解析器);
完成=1;
}
已完成的返回;
}
现在这是主文件,其中存储了指向其他纯文本文件的路径: lol.dat
5
lold/lol1.dat
lold/lol2.dat
lold/lol3.dat
lold/lol4.dat
lold/lol5.dat
5
lold/lol1.dat
lold/lol2.dat
lold/lol3.dat
lold/lol4.dat
lold/lol5.dat

以及lolX.dat的一个示例:

Qual'è la vittoria di cristo?
3 4 5 12 44.9

基督维多利亚广场?
3 4 5 12 44.9

在“engine_start”的第一次迭代之后,我得到了SIGSEGV,可能是由于文件*解析器(但我可能完全错了,我现在不知道)


有人能帮我解决这个问题吗?谢谢。

进行以下更改并重试-

struct _elem
{
char *title; // allocate the memory for this.
int ok;
int almost;
int nope;
int hits;
float last_rank;
};
在为元素标题分配内容之前,需要为其分配内存

int engine_start(Chapter *elem, char *source)
{
FILE *parser;
int done = 0;

parser = fopen(source, "r");

if (parser == NULL) printf("[!!] Error while opening %s, aborting.\n", source);
else
{
    elem->title=(char *)malloc(100);  // include this line.
    fgets(elem->title, 100, parser);
    fscanf(parser, "%d %d %d %d %f", &(elem->ok),   &(elem->almost),
                                     &(elem->nope), &(elem->hits),
                                     &(elem->last_rank) );

    fclose(parser);
    done = 1;
}

return done;
}

在获取用户输入时,不应该对路径\r使用const char。@Igor是的,你是对的,但这不会解决SIGSEGV,它只是语义解决,真的忘记了这一点。。。谢谢你睁开我的眼睛!
int engine_start(Chapter *elem, char *source)
{
FILE *parser;
int done = 0;

parser = fopen(source, "r");

if (parser == NULL) printf("[!!] Error while opening %s, aborting.\n", source);
else
{
    elem->title=(char *)malloc(100);  // include this line.
    fgets(elem->title, 100, parser);
    fscanf(parser, "%d %d %d %d %f", &(elem->ok),   &(elem->almost),
                                     &(elem->nope), &(elem->hits),
                                     &(elem->last_rank) );

    fclose(parser);
    done = 1;
}

return done;
}