C 使用结构中的指针读取文件
我试图从一个结构中有指针的文件中读写。但当我从文件中读取时,我看到一些垃圾值。我在Linux上使用GCC4.7.2。我需要一些帮助 阅读: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_集);
//从文件中读取
#包括
类型定义结构
{
字符*名称;
字符*电话;
}上市;
内部主(空)
{
列出电话列表[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 objectphoneList[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");