Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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_Arrays_File_Pointers - Fatal编程技术网

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