C 使用结构中的指针读取文件

C 使用结构中的指针读取文件,c,pointers,C,Pointers,我试图从一个结构中有指针的文件中读写。但当我从文件中读取时,我看到一些垃圾值。我在Linux上使用GCC4.7.2。我需要一些帮助 阅读: //从文件中读取 #包括 类型定义结构 { 字符*名称; 字符*电话; }上市; 内部主(空) { 列出电话列表[14]; FILE*fp=NULL; fp=fopen(“/media/Study/PhoneDirectory.dat”,“rb”); 如果(fp==NULL) printf(“打开文件时出错!!!”; fseek(fp,0,SEEK_集);

我试图从一个结构中有指针的文件中读写。但当我从文件中读取时,我看到一些垃圾值。我在Linux上使用GCC4.7.2。我需要一些帮助

阅读:

//从文件中读取
#包括
类型定义结构
{
字符*名称;
字符*电话;
}上市;
内部主(空)
{
列出电话列表[14];
FILE*fp=NULL;
fp=fopen(“/media/Study/PhoneDirectory.dat”,“rb”);
如果(fp==NULL)
printf(“打开文件时出错!!!”;
fseek(fp,0,SEEK_集);
if(fread(&phoneList[1],sizeof(清单),1,fp)==1)
printf(“%s%s”,电话列表[1]。姓名,电话列表[1]。电话);
fclose(fp);
返回0;
}
并写下:

//Write to file

#include<stdio.h>

typedef struct 
{
    char* name;
    char* phone;
}LISTING;

int main(void)
{
    LISTING phoneList[2];   
    FILE * fp = NULL;

    fp = fopen("/media/Study/PhoneDirectory.dat","wb");

    phoneList[1].name = "Santosh";
    phoneList[1].phone = "9657681798";

    if(fwrite(&phoneList[1],sizeof(LISTING),1,fp)==1)
        printf("inserted");

    fclose(fp);

    return 0;
}
//写入文件
#包括
类型定义结构
{
字符*名称;
字符*电话;
}上市;
内部主(空)
{
列出电话列表[2];
FILE*fp=NULL;
fp=fopen(“/media/Study/PhoneDirectory.dat”,“wb”);
电话列表[1]。name=“Santosh”;
电话列表[1]。phone=“9657681798”;
if(fwrite(&phoneList[1],sizeof(清单),1,fp)==1)
printf(“插入”);
fclose(fp);
返回0;
}
上面的语句调用未定义的行为

由于struct object
phoneList[1]
的指针
name
phone
未初始化,因此取消对它们的引用将调用UB。在您的情况下,他们正在抛出垃圾值,但这也可能导致崩溃


为了适应读取文件内容并将其存储在struct对象中的情况,请使用
getline
函数逐行读取它们(假设所有详细信息都是逐行存储的),然后为
char
指针动态分配内存,然后将它们分配给读取值。但是,这种方法会导致大量内存管理,这很容易出错

指针仅在其来源的应用程序进程中才有意义。如果您将它们写入一个文件,正如您在这里所做的那样,您读回的值将毫无意义——它们很可能指向未初始化的内存,或者指向正在完全用于其他用途的内存


您需要想出另一种将这些数据写入文件的方法。

您遇到的问题是在char*和char[]之间模棱两可。您当然可以将字符串文字指定给char*,但您需要了解列表结构的内容,以及如何将数据序列化和反序列化到文件中

保存一个进程中的指针并将其读入另一个进程是没有意义的,因此您可能希望保存内容(指针指向的内容)。您希望将两个值(姓名、电话)存储到文件中。既然您可能想存储文字名称和文字电话,让我们考虑文件可能是什么样子:

roast duck|212-333-4444
peking duck|411-511-61111
duck soup|314-222-3333
free duck|800-111-2222
...
您需要函数来序列化和反序列化数据。因为您的列表类型是指针,所以在读取这些值时,需要为这些值分配适当的空间,并且需要函数(方法)从文件中读取序列化数据并将序列化数据写入文件

阅读(你需要分配足够的空间)

书写(您需要提供正确的格式)

下面是您需要如何修改代码

//read from a file
#include<stdio.h>

typedef struct 
{
char* name;
char* phone;
}LISTING;

int main(void)
{
    LISTING phoneList[14];  
    FILE* fp = NULL;
    if( !(fp = fopen("/media/Study/PhoneDirectory.dat","rb")) ) {
        printf("Error opening file!!!");
        exit(1);
    }

    fseek(fp,0,SEEK_SET);
    if( listing_read(fp,&phoneList[0]) >= 0 ) {
        printf("%s %s",phoneList[0].name,phoneList[0].phone);
    }
    fclose(fp);

    return 0;
}
您已将常量字符串的指针指定给结构成员

但是,如果要分配空间(例如,使用strdup())

您已经为字符串分配了空间,为这些成员元素分配了独立的位置。哪个更可能是你想要做的



请注意,我使用了phonelist[0],因为C具有零基数组。

数字1不允许写入文件:不允许写入指针…@user101285这将是第二个迁移到堆栈溢出的问题。请阅读每个网站上的,以熟悉两者之间的区别-这将帮助您更快地获得更好的答案。您实际上想在这里写什么?这个答案是正确的,因为从文件中读取的指针在阅读过程中无效。更多细节会有所帮助。
roast duck|212-333-4444
peking duck|411-511-61111
duck soup|314-222-3333
free duck|800-111-2222
...
int
listing_read(FILE*fp, LISTING* listing)
{
    char name_buffer[100];
    char phone_buffer[100];

    if(!fp) return(-1);
    if(!listing) return(-2);

    int res = fscanf(fp,"%s|%s\n",name_buffer,phone_buffer);
    if( !res ) {
        //handle error here
    }
    //careful here, you cannot free if you didn't malloc/strdup
    if(listing->name) free(listing->name);
    if(listing->phone) free(listing->phone);

    listing->name = strdup(name_buffer);
    listing->phone = strdup(phone_buffer);
    return(0);
}
int
listing_write(FILE*fp, LISTING* listing)
{
    if(!fp) return(-1);
    if(!listing) return(-2);

    fprintf(fp,"%s|%s\n",listing->name,listing->phone);
    return(0);
}
//read from a file
#include<stdio.h>

typedef struct 
{
char* name;
char* phone;
}LISTING;

int main(void)
{
    LISTING phoneList[14];  
    FILE* fp = NULL;
    if( !(fp = fopen("/media/Study/PhoneDirectory.dat","rb")) ) {
        printf("Error opening file!!!");
        exit(1);
    }

    fseek(fp,0,SEEK_SET);
    if( listing_read(fp,&phoneList[0]) >= 0 ) {
        printf("%s %s",phoneList[0].name,phoneList[0].phone);
    }
    fclose(fp);

    return 0;
}
//Write to file
#include<stdio.h>

typedef struct 
{
char* name;
char* phone;
}LISTING;

int main(void)
{
    LISTING phoneList[14];   
    FILE* fp = NULL;

    if( !(fp = fopen("/media/Study/PhoneDirectory.dat","wb")) ) {
        printf("error, cannot write file\n");
        exit(1);
    }

    phoneList[0].name = "Santosh";
    phoneList[0].phone = "9657681798";

    if( listing_write(fp,&phoneList[0])>=0) {
        printf("inserted");
    }
    fclose(fp);

    return 0;
}
    phoneList[0].name = "Santosh";
    phoneList[0].phone = "9657681798";
    phoneList[0].name = strdup("Santosh");
    phoneList[0].phone = strdup("9657681798");