在c中填充文件中的指针数组
我想读取在在c中填充文件中的指针数组,c,arrays,file,pointers,C,Arrays,File,Pointers,我想读取在fprintf(fp,“%s%s%s\n”,p->name,p->姓氏,p->tc)中写入的数据格式。我用创建了struct patients**p struct patients **create_array(struct patients **ptr,int length){ int i; ptr=(struct patients **)malloc(length*sizeof(struct patients)); return ptr; } 上面的函数创建指针数组
fprintf(fp,“%s%s%s\n”,p->name,p->姓氏,p->tc)中写入的数据代码>格式。我用创建了struct patients**p
struct patients **create_array(struct patients **ptr,int length){
int i;
ptr=(struct patients **)malloc(length*sizeof(struct patients));
return ptr;
}
上面的函数创建指针数组并将其交给main。Main调用read_file()函数从以已知格式写入的文件中读取数据。但是我的数据没有被填满,当我试图打印它们的时候,它打印的是没有意义的东西。我认为在读取数据时存在问题,这就是为什么我只使用读取函数的原因。我有什么问题?欢迎所有建议
#include<stdio.h>
struct patients
{
int importance;
char name[10], surname[10], tc[11];
};
FILE *file_opening(char x[])
{
return (fopen(x,"w+"));
}
writing_file (FILE *fp, struct patients *p)
{
fprintf(fp,"%s %s %s\n", p->name,p->surname,p->tc);
}
struct patients **read_file (FILE *fp,struct patients **p)
{
int i=-1;
do{
i++;
}while(fscanf(fp,"%s %s %s",p[i]->name,p[i]->surname,p[i]->tc) !=EOF);
return p;
}
void show_all_patients(struct patients **p, int start_index, int length){
int i;
for(i=start_index;i<length;i++)
printf("%s %s %s",p[i]->name,p[i]->surname,p[i]->tc);
}
struct patients **create_array(int length){
return (struct patients **)malloc(length*sizeof(struct patients));
}
int menu(void){
int choice;
printf("1)take patient\n2)show all patients\n3)exit");
scanf("%d",&choice);
return choice;
}
main(){
int i=0,j,choice,cured_patient=0,length=1;
FILE *fp;
struct patients **ptr;
char file_name[40]="patient_list.txt";
ptr=create_array(length);
fp=file_opening(file_name);
ptr=read_file(fp,ptr);
do{
choice=menu();
if(choice==1){
printf("%s %s %s\n",ptr[i]->name,ptr[i]->surname,ptr[i]->tc);
i++;
}
else if(choice==2){
show_all_patients(ptr,i,length);
}
}while(choice!=3);
for(j=i;j<length;j++)
writing_file(fp,ptr[j]);
fclose(fp);
}
#包括
结构性病人
{
内在重要性;
字符名称[10],姓氏[10],tc[11];
};
文件*文件打开(字符x[]
{
返回(fopen(x,“w+”));
}
写入_文件(文件*fp,结构*p)
{
fprintf(fp,“%s%s%s\n”,p->name,p->姓氏,p->tc);
}
结构患者**读取文件(文件*fp,结构患者**p)
{
int i=-1;
做{
i++;
}而(fscanf(fp,“%s%s%s”,p[i]->姓名,p[i]->姓氏,p[i]->tc)!=EOF);
返回p;
}
void显示所有患者(结构患者**p,整数开始索引,整数长度){
int i;
for(i=start_索引;iname,p[i]->姓氏,p[i]->tc);
}
结构**创建数组(整数长度){
返回(结构化患者**)malloc(长度*大小(结构化患者));
}
int菜单(无效){
智力选择;
printf(“1)接受患者\n2)显示所有患者\n3)退出”);
scanf(“%d”,选择(&C);
回报选择;
}
main(){
int i=0,j,选择,治愈患者=0,长度=1;
文件*fp;
结构患者**ptr;
char file_name[40]=“patient_list.txt”;
ptr=创建_数组(长度);
fp=文件打开(文件名);
ptr=读取文件(fp,ptr);
做{
选择=菜单();
如果(选项==1){
printf(“%s%s%s\n”,ptr[i]->姓名,ptr[i]->姓氏,ptr[i]->tc);
i++;
}
else if(选项==2){
显示所有患者(ptr、i、长度);
}
}while(选项!=3);
对于(j=i;j我会改变的事情
返回create_array
的值和输入参数
该功能也可简化为:
struct patients* create_array(int length)
{
return malloc(length*sizeof(struct patients));
}
将值和参数返回到read\u文件
struct patients* read_file (FILE *fp ,struct patients *p)
{
int i=-1;
do
{
i++;
} while(fscanf(fp, "%s %s %s",p[i].name, p[i].surname, p[i].tc) != EOF);
return p;
}
请确保您提供了要读取的最大字符数。否则,您可能最终读取的字符数超过数组所能容纳的字符数
改变
} while(fscanf(fp, "%s %s %s",p[i].name, p[i].surname, p[i].tc) != EOF);
到(给定结构中数组的大小)
代码的问题:
没有writing_file
的返回值。添加void
作为返回类型
void writing_file (FILE *fp, struct patients *p)
{
fprintf(fp,"%s %s %s\n", p->name,p->surname,p->tc);
}
您需要#包括
如果不这样做,malloc
的返回值被假定为int
,这可能会导致奇怪的问题
语法错误:
根据您对ptr
的定义
ptr=create_array(length);
及
语法无效。我在gcc中遇到以下错误:
soc.c:在函数“main”中:
soc.c:58:7:错误:对数组类型的表达式赋值
ptr=创建_数组(长度);
^
soc.c:60:7:错误:对数组类型的表达式赋值
ptr=读取文件(fp,ptr);
如果您的编译器没有报告这两行上的错误,那么是时候使用不同的编译器了
读取和写入同一文件
您正在使用相同的文件*
进行读取和写入。不清楚您是有意这样做,还是您自己出错了
使用以下命令打开文件时:
return (fopen(x,"w+"));
文件内容被截断。有关详细信息,请参阅。请特别注意参数下的表格。它显示:
“w+”|写扩展|创建读/写文件|销毁内容|创建新文件
如果只想从文件中读取数据,请使用
return (fopen(x,"r"));
如果要从文件中读取数据并将数据写回,请先使用上述模式读取数据,关闭文件,然后使用以下模式重新打开:
return (fopen(x,"w"));
处理一系列患者
我认为你应该使用:
FILE* fp = NULL;
int length=10;
struct patients *ptr = NULL;
ptr=create_array(length);
fp=file_opening(file_name);
read_file(fp, ptr, length);
适当地调整代码的其余部分
添加代码以释放内存
每次调用malloc
都应该有一个对应的调用free
void delete_array(struct patients *ptr)
{
free(ptr);
}
并在函数结束前从main
调用它
您的编译器没有给您任何有用的错误消息吗?没有。该程序已编译并运行良好。只有当我尝试打印**p中的struct中的值时,才会出现问题。它必须是指针数组格式,如int*p[10]
您只让它们成为彼此不相连的指针。@BeyzaSelvi,每个指针都应该指向一个struct
还是一个struct
s的数组?p是一个包含struct指针的数组,该数组中的每个指针都指向一个结构。但是p是指针数组,它的元素包含struct。所以p必须是**p
不是吗?另外,对于3)它不需要确保我提供最大数量的字符。fscanf deosnt读取空格,我的输入/输出格式类似于%s%s”
。我使用该格式编写了文件,如果我尝试以相同的格式读取它们,它应该读取它。我给了它较少的最大值,它应该一直读取到读取一个空格。所以字符串必须是,并且它是该格式。当指针只指向一个项目时,使用对象代替是有意义的。如果p
是一个数组像你说的那样,我对create_array
和read_array
的建议是不正确的。请发表一篇文章,这样我就可以看出哪里出了问题。关于%s
与%9s
的使用,如果一个名字有9个以上的字符,你最终会使用不应该使用的内存。%9s
仍将在下一个空格处停止,但即使下一个字符不是空格,它也将在第9个字符后停止读取。我按照您的建议编辑了文章。现在您可以看到您想要的所有内容。我想用户会看到的
FILE* fp = NULL;
int length=10;
struct patients *ptr = NULL;
ptr=create_array(length);
fp=file_opening(file_name);
read_file(fp, ptr, length);
void delete_array(struct patients *ptr)
{
free(ptr);
}